2013-03-20 6 views

Antwort

28

Nein. Instanzvariablen werden erst definiert, wenn Sie ihnen zugewiesen werden, und attr_accessor tut dies nicht automatisch.

Der Versuch, auf eine nicht definierte Instanzvariable zuzugreifen, gibt nil zurück, aber definiert diese Variable nicht. Sie werden nicht wirklich definiert, bis Sie zu ihnen schreiben. attr_accessor verlässt sich auf dieses Verhalten und führt nur einen Getter/Setter aus.

Sie können dies überprüfen, indem .instance_variables Check-out:

class Test 
    attr_accessor :something 
end 

Eine neue Instanz von x hat keine Instanzvariablen:

x = Test.new # => #<Test:0xb775314c> 
x.instance_variables # => [] 

den Getter Aufrufen @something nicht dazu führt, definiert zu werden:

x.something # => nil 
x.instance_variables # => [] 

In voking die Setter tut Ursache @something werden definiert:

x.something = 3 # => 3 
x.instance_variables # => ["@something"] 

Einstellung something zurück zu nil nicht instance_variables zurückzukehren verursacht, so können wir sicher sein, dass das erste zurück leere Array nicht einfach ein Fall von ist instance_variables Weglassen nil Werte:

x.something = nil # => nil 
x.instance_variables # => ["@something"] 

Sie können auch überprüfen, dass dieses Verhalten nicht nur spezifisch für attr_accessor ist:

class Test 
    def my_method 

    @x # nil 

    instance_variables # [] 

    @x = 3 

    instance_variables # ["@x"] 
    end 
end 

Test.new.my_method 
2

Sortieren von. In Ruby werden Instanzvariablen erstellt, wenn sie zum ersten Mal zugewiesen werden. Dies ist für den Programmierer völlig transparent. Sie werden standardmäßig auf Null gesetzt, bis sie zugewiesen werden.

Ex:

class Foo 
    attr_accessor :bar 
    def baz 
    @nonexistant 
    end 
end 
f.bar #=> nil 
f.baz #=> nil 
f.bar = 4 
f.bar #=> 4 

Bis Sie Wert auf eine Instanz Variablen zuweisen, schwimmt es in einem undefinierten Zustand Null.

Verwandte Themen