2012-08-12 74 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 }]