例如,如果我們寫Ruby的attr_accessor會自動爲屬性創建實例變量嗎?
class MyClass
attr_accessor :something
end
,但並沒有明確與實例變量@something
創建一個初始化方法,並紅寶石自動創建呢?
例如,如果我們寫Ruby的attr_accessor會自動爲屬性創建實例變量嗎?
class MyClass
attr_accessor :something
end
,但並沒有明確與實例變量@something
創建一個初始化方法,並紅寶石自動創建呢?
編號實例變量在分配給它們之前未定義,並且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"]
設置something
回nil
不會導致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
整理。在Ruby中,實例變量在首次分配時創建。這對程序員來說是完全透明的。他們默認爲零,直到分配。
例:
class Foo
attr_accessor :bar
def baz
@nonexistant
end
end
f.bar #=> nil
f.baz #=> nil
f.bar = 4
f.bar #=> 4
直到你分配一個值實例變量,它漂浮在一個不確定的零狀態。