1

我不想从外部(通过 attr_accessor)设置一个类的类变量,然后从它的一个对象内部访问它。我正在使用红宝石 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 一样。有人可以解释为什么会这样吗?

4

3 回答 3

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
于 2011-08-26T06:22:30.323 回答
4

怎么样cattr_accessor

于 2011-08-26T08:23:16.763 回答
0

请记住,这@@class_var对所有类都是全局的。

于 2011-08-26T08:16:56.463 回答