如果我有一个attr_accessor
的类,它默认创建一个实例变量以及相应的getter和setter。但是,有没有办法让它来创建一个类变量或一个类实例变量?
答案 0 :(得分:46)
像这样:
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
答案 1 :(得分:20)
在Rails中,(或在require 'active_support'
的任何地方),您可以使用cattr_accessor :name
来获取真正的类变量访问器。
其他人指出的类实例变量通常更有用。 APIdock cattr_accessor
page有一些有用的讨论,可以澄清您何时不想要另一个,以及cattr_accessor
,cattr_reader
和cattr_writer
函数的来源。