我不想从外部(通过attr_accessor)设置类的类变量,然后从其中一个对象内部访问它。我正在使用ruby 1.9.2。这是我的代码:
class Service
def initialize(id)
@my_id = id
end
class << self
attr_accessor :shared_id
end
def system_id
@my_id + @@shared_id
end
end
如果我设置Service.shared_id = "A2"
,然后拨打Service.new("A").system_id
,则不会返回“AA2”。它显示以下错误:
服务中未初始化的类变量@@ shared_id
如果我没有设置Service.service_id,则行为就像。有人可以解释为什么会这样吗?
答案 0 :(得分:5)
attr_accessor
创建操作实例变量的方法 - 它不创建实例或类变量。要创建类变量,必须将其设置为:
@@shared_id = something
没有辅助方法为类变量生成访问器,所以你必须自己编写它们。
然而,由于奇怪的查找规则,类变量很少使用 - 甚至可以避免使用。而是使用类级别的实例变量。
class Service
@shared_id = thing
class << self
attr_accessor :shared_id
end
def system_id
# use self.class.shared_id; you could add a shared_id helper to generate it, too.
end
end
答案 1 :(得分:4)
cattr_accessor
怎么样?
答案 2 :(得分:0)
请记住@@class_var
对所有类都是全局的。