2013-03-20 79 views

回答

28

編號實例變量在分配給它們之前未定義,並且attr_accessor不會自動執行。

試圖訪問未定義的實例變量返回nil,但未定義該變量。直到寫入爲止,它們纔會真正被定義。 attr_accessor依賴於這種行爲,除了定義一個getter/setter外,什麼也不做。

您可以檢查出.instance_variables驗證這一點:

class Test 
    attr_accessor :something 
end 

x一個新的實例沒有實例變量:

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

調用的getter不會導致@something成爲定義:

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

In voking二傳手確實原因@something成爲定義:

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

設置somethingnil不會導致instance_variables恢復,所以我們可以肯定的是返回的第一個空數組不是簡單的情況下, instance_variables省略nil值:

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

您也可以驗證這是不是單純的特定行爲attr_accessor

class Test 
    def my_method 

    @x # nil 

    instance_variables # [] 

    @x = 3 

    instance_variables # ["@x"] 
    end 
end 

Test.new.my_method 
2

整理。在Ruby中,實例變量在首次分配時創建。這對程序員來說是完全透明的。他們默認爲零,直到分配。

例:

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

直到你分配一個值實例變量,它漂浮在一個不確定的零狀態。