如果我有一個attr_accessor
類,它默認創建一個實例變量以及相應的getter和setter。但是,不是創建一個實例變量,有沒有辦法讓它創建一個類變量或類實例變量呢?Ruby的attr_accessor如何生成類變量或類實例變量而不是實例變量?
回答
像這樣:
class TYourClass
class << self
attr_accessor :class_instance_variable
end
end
你可以看一下這是開元類的類(其中的類本身就是一個實例),並添加屬性給它。
attr_accessor
是類Class
的方法,它向類中添加了兩個方法,一個讀取實例變量,另一個讀取實例變量,另一個方法設置它。這裏是一個可能的實現:
class Class
def my_attr_accessor(name)
define_method name do
instance_variable_get "@#{name}"
end
define_method "#{name}=" do |new_val|
instance_variable_set "@#{name}", new_val
end
end
end
完全未經測試的類屬性訪問器:
class Class
def class_attr_accessor(name)
define_method name do
class_variable_get "@@#{name}"
end
define_method "#{name}=" do |new_val|
class_variable_set "@@#{name}", new_val
end
end
end
謝謝。我喜歡你的表達方式,它打開了類的元類,並添加了一個附錄。但是爲什麼它會產生一個類實例變量而不是一個類變量?並且是否有可能讓它產生一個類變量,或者這個語法是否僅適用於類實例變量? – 2009-05-21 23:28:21
我不同意,再次查看答案 – 2009-05-21 23:36:57
在Rails中(或任何你做require 'active_support'
),可以使用cattr_accessor :name
來獲得真正的類變量的訪問器。
其他人指出的類實例變量通常更有用。 APIdock cattr_accessor
page有一些有用的討論,說明您何時不需要其他人,以及cattr_accessor
,cattr_reader
和cattr_writer
函數的來源。
- 1. Ruby類實例變量與類變量
- 2. Ruby中的類變量實例變量
- 3. Ruby中的類實例變量和實例變量
- 4. 實例變量和attr_accessor
- 5. 在ruby中獲取attr_accessor /實例變量
- 6. 如何給attr_accessor類ruby中的所有實例變量
- 7. python類實例變量和類變量
- 8. Perl創建類變量而不是實例變量
- 9. 類變量vs實例變量--Python
- 10. 類型的實例變量
- 11. Ruby類級別的實例變量
- 12. Ruby正在本地變量中存儲類而不是實例變量
- 13. Ruby實例變量和局部變量
- 14. Ruby的類變量和實例變量之間的區別
- 15. ruby類實例變量配置模式
- 16. Ruby - 類實例變量getter setter方法
- 17. Rails和Ruby類,實例變量
- 18. NSString類實例變量
- 19. Backbone.js實例與類變量
- 20. 重載類實例變量
- 21. 類實例作爲變量?
- 22. 類別和實例變量
- 23. 類塊實例變量
- 24. 訪問類實例變量
- 25. 實例和類變量
- 26. Pthread實例變量從類
- 27. Ruby的實例變量
- 28. Ruby中的實例變量
- 29. 實例變量或靜態變量?
- 30. 爲所有實例變量設置Attr_accessor
通過「[Seeing Metaclasses Clearly]」(http://viewsourcecode.org/why/hacking/seeingMetaclassesClearly.html)工作「;」當試圖理解Ruby的類和對象的工作方式時非常有幫助。 – 2009-05-22 06:48:19