2012-05-18 63 views
7

所以我知道你可以通过调用#instance_variables来获得Ruby中的所有实例变量,但是如果它们还没有被设置,那么它们就不会显示出来。在ruby中获取attr_accessor /实例变量

class Walrus 
    attr_accessor :flippers, :tusks 
end 

w = Walrus.new 
w.instance_variables # => [] 
w.tusks    # => nil 
w.instance_variables # => [:@tusks] 

我要访问所有attr_accessor立即定义的实例变量。

w = Walrus.new 
w.instance_variables # => [:@tusks, :@flippers] 
+0

的可能重复[如何打通ATTR \ _reader或ATTR \ _accessor中定义的属性(http://stackoverflow.com/questions/10006889/how-to-get-attributes-that-were -defined贯通ATTR阅读器 - 或ATTR存取器) –

回答

15

那么,它们还不存在。实例变量在首次分配时弹出。如果你想让它们在一个全新的实例中,那么在构造函数中触摸它们。

class Walrus 
    attr_accessor :flippers, :tusks 

    def initialize 
    self.flippers = self.tusks = nil 
    end 
end 

w = Walrus.new 
w.instance_variables # => [:@tusks, :@flippers] 
5

那么,attr_accessor创建了一对方法,一个setter和一个getter。我不知道是否有一个内置的方式来获得一个名单,但你可以通过看实例方法所产生的对:

Walrus.instance_methods.find_all do |method| 
    method != :== && 
    method != :! && 
    Walrus.instance_methods.include?(:"#{method}=") 
end 
0

如何使用方法减去对象或类的方法呢?返回数组将包含您定义的属性/方法以及在getter/accessor中定义的实例变量。

your_instance_name.methods - Object.methods 
your_instance_name.methods - Class.methods