Ruby的attr_accessor如何产生类变量或类实例变量而不是实例变量?
Posted
技术标签:
【中文标题】Ruby的attr_accessor如何产生类变量或类实例变量而不是实例变量?【英文标题】:How can Ruby's attr_accessor produce class variables or class instance variables instead of instance variables? 【发布时间】:2010-10-28 02:25:18 【问题描述】:如果我有一个带有attr_accessor
的类,它默认创建一个实例变量以及相应的getter 和setter。但是不是创建一个实例变量,有没有办法让它创建一个类变量或类实例变量呢?
【问题讨论】:
通过“Seeing Metaclasses Clearly”工作;在尝试理解 Ruby 的类和对象的工作方式时非常有用。 【参考方案1】:像这样:
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
【讨论】:
谢谢。我喜欢你说它打开类的元类并添加附录的方式。但是为什么它会产生一个类实例变量而不是一个类变量呢?是否有可能让它也产生一个类变量,还是这种语法只适用于类实例变量? 我不一样,再看答案 这仅适用于类实例变量,b/c attr_* 为(某些对象的)实例变量定义方法。 instance_variable_set 和 class_variable_set 的参数之间有一些 "," 缺失,但编辑太小无法提交。【参考方案2】:在 Rails 中(或您在任何地方使用 require 'active_support'
),您可以使用 cattr_accessor :name
获取真正的类变量访问器。
其他人指出的类实例变量通常更有用。 APIdock cattr_accessor
page 进行了一些有益的讨论,阐明了您何时需要一个而不是另一个,以及 cattr_accessor
、cattr_reader
和 cattr_writer
函数的来源。
【讨论】:
更容易 - 不知道 rails 提供了这个。谢谢!以上是关于Ruby的attr_accessor如何产生类变量或类实例变量而不是实例变量?的主要内容,如果未能解决你的问题,请参考以下文章