2012-08-12 35 views
35

請幫助我以同樣的方式獲取在類中聲明的所有實例變量instance_methods向我展示了類中可用的所有方法。獲取在類中聲明的所有實例變量

class A 
    attr_accessor :ab, :ac 
end 

puts A.instance_methods #gives ab and ac 

puts A.something   #gives me @ab @ac... 
+1

我仍然不知道這是什麼。第二部分是問,或者它如何與需要得到所有來自對象的實例變量。 – 2012-08-12 22:12:52

+0

實例變量沒有在任何地方聲明。這個問題沒有意義。 – 2012-08-13 01:21:35

+1

「name」變量也是動態創建的。 – 2012-08-13 05:01:14

回答

46

您可以使用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] 
+0

Ruby中是否有任何方法可以計算未定義的變量。 正如我們在attr_accessor中提供的列表一樣。所以他們的入場已經完成了。 謝謝回答 – 2012-08-12 21:26:27

+0

@AkshayVishnoi'attr_accessor:foo'只是產生'def foo; @foo; end'和'def foo =(val); @foo = val; end'。沒有任何東西被存儲 – 2012-08-12 21:29:24

+0

感謝您的幫助,但我仍然沒有找到自己的方式來回答我的問題。 像先生一樣,如果我有包含變量名稱的類'Player'。現在我已經初始化了5個對象。現在,如果我想找到名稱爲「Ak」的玩家數量,那麼我將如何在模塊中動態生成此功能,名爲「MyModule」,它包含在「Player」類中 感謝您的合作 – 2012-08-12 21:54:16

6

如果你想獲得的所有實例變量的值,你可以嘗試這樣的事:

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 }]