- 爲什麼叫
Foo.set
前Foo.val
回報nil
,而不是"foo"
? - 是否有階級評價初始化
@val
任何機制? 在其範圍
@val = "foo"
存儲到?紅寶石元編程:初始化變量singleton_classclass Foo class << self @val = "foo" attr_reader :val def set(val) @val = val end end end p Foo.val # nil Foo.set("bar") p Foo.val # "bar"
3
A
回答
9
可以在富初始化@val
這樣的:
class Foo
@val = "foo"
class << self
attr_reader :val
def set(val)
@val = val
end
end
end
p Foo.val #=> "foo"
Foo.set("bar")
p Foo.val #=> "bar"
你的代碼初始化@val
不富,但Foo的元類
3
紅寶石一般在分析他們執行的表達式。爲什麼預期你的代碼沒有執行的原因是因爲你設置一個類的實例變量的單類Foo的,但在另一方面,你正在訪問Foo自己的類實例變量,這就是爲什麼它不工作:
class << self
@val = "foo" # scope is class scope of singleton class of Foo
attr_reader :val
def set(val)
# scope is instance scope of singleton class of Foo (equal to Foo itself)
@val = val
end
end
這就是爲什麼Foo.val
得到你的情況nil
- 它尚未設置。
階級的評價設置val
可以在維克多已經證明的方式來實現。
也this post請參閱有關範圍的討論。
0
無需使用#SET。 簡單定義#val方法並使用nil guard:
class Foo
class << self
def val; @val ||= "bar" end
end
end
p Foo.val #=> "bar"
相關問題
- 1. 初始化紅寶石
- 2. 紅寶石未初始化的常量
- 3. 紅寶石 - 未初始化的常量
- 4. NameError:未初始化的常量歌...編程紅寶石
- 5. 紅寶石:質量初始化實例變量
- 6. 未初始化的常量使用Twitter的紅寶石寶石
- 7. 紅寶石寶石devise無法生成初始化程序
- 8. 紅寶石初始化實例變量以外的方法
- 9. 初始化類的成員變量失去價值紅寶石
- 10. 紅寶石「實例變量未初始化」警告
- 11. 初始化實例變量爲一個數組 - 紅寶石
- 12. 紅寶石/黃瓜測試初始化
- 13. 紅寶石類的計數初始化
- 14. 初始化紅寶石散列問題
- 15. 紅寶石初始化和自我
- 16. 紅寶石未初始化不斷
- 17. 紅寶石自我。 vs @初始化
- 18. 紅寶石初始化對象
- 19. 紅寶石,未初始化不斷
- 20. 元編程紅寶石
- 21. 「在初始化塊」未初始化不斷Testdeck NameError(紅寶石)
- 22. 紅寶石的SoundCloud寶石:未初始化不斷的SoundCloud
- 23. 紅寶石寶石加載,但依然給人「未初始化的常量」
- 24. 紅寶石與Swig:NameError:未初始化的常量
- 25. 紅寶石:未初始化的常量配置(NameError)
- 26. 軌道上的紅寶石未初始化的常量錯誤
- 27. 紅寶石及Mongoid - 未初始化的常量
- 28. iTunes搜索紅寶石:未初始化的常量Itunes
- 29. 紅寶石klout寶石包括變化
- 30. 紅寶石元編程:動態實例變量名