2012-05-18 12 views
7

So weiß ich, dass Sie alle Instanzvariablen in Ruby durch Aufruf #instance_variables abrufen können, aber wenn sie noch nicht festgelegt wurden, werden sie nicht angezeigt.Get attr_accessor/Instanzvariablen in Ruby

Beispiel

class Walrus 
    attr_accessor :flippers, :tusks 
end 

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

Ich möchte alle die Instanzvariablen von attr_accessor sofort definiert zuzugreifen.

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

möglich Duplikat von [Wie Attribute zu erhalten, die durch attr \ _reader oder attr \ _accessor definiert wurde] (http://stackoverflow.com/questions/10006889/how-to-get-attributes-that-were -defined-through-attr-Leser-oder-attr-Accessor) –

Antwort

15

Nun, sie existieren noch nicht. Instanzvariablen entstehen bei der ersten Zuweisung. Wenn Sie sie in einer brandneuen Instanz haben möchten, dann berühren Sie sie im Konstruktor.

class Walrus 
    attr_accessor :flippers, :tusks 

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

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

Nun, schafft attr_accessor ein Paar von Methoden, einen Setter und einen Getter. Ich bin nicht sicher, ob es eine eingebaute Möglichkeit, eine Liste zu bekommen, aber man kann die Instanz-Methoden für die daraus entstehenden Paare schaut durch:

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

Wie sei es Methoden minus die Methoden von Object oder Klasse? Das zurückgegebene Array enthält Ihre definierten Attribute/Methoden und die in Getter/Accessor definierten Instanzvariablen.

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