Подтвердить что ты не робот

Получить все переменные экземпляра, объявленные в классе

Пожалуйста, помогите мне получить все переменные экземпляра, объявленные в классе, таким же образом instance_methods показывает мне все методы, доступные в классе.

class A
  attr_accessor :ab, :ac
end

puts A.instance_methods  #gives ab and ac

puts A.something         #gives me @ab @ac...
4b9b3361

Ответ 1

Вы можете использовать instance_variables:

A.instance_variables

но это, вероятно, не то, что вы хотите, поскольку оно получает переменные экземпляра в классе A, а не экземпляр этого класса. Поэтому вы, вероятно, захотите:

a = A.new
a.instance_variables

Но обратите внимание, что просто вызов attr_accessor не определяет какие-либо переменные экземпляра (он просто определяет методы), поэтому в экземпляре не будет никаких экземпляров, пока вы не установите их явно.

a = A.new
a.instance_variables #=> []
a.ab = 'foo'
a.instance_variables #=> [:@ab]

Ответ 2

Если вы хотите получить все значения переменных экземпляров, вы можете попробовать что-то вроде этого:

class A
  attr_accessor :foo, :bar

  def context
    self.instance_variables.map do |attribute|
      { attribute => self.instance_variable_get(attribute) }
    end
  end
end

a = A.new
a.foo = "foo"
a.bar = 42
a.context #=> [{ :@foo => "foo" }, { :@bar => 42 }]