什么不能从ruby中的对象访问类变量?

时间:2011-08-26 06:17:13

标签: ruby class-variables

我不想从外部(通过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,则行为就像。有人可以解释为什么会这样吗?

3 个答案:

答案 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对所有类都是全局的。