2012-05-18 62 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