【问题标题】:Class variable using attr_accessor inside class << self在类 << self 中使用 attr_accessor 的类变量
【发布时间】:2026-02-07 20:20:26
【问题描述】:

有人能解释一下为什么 self.foo= 在类

class A
  class << self
    attr_accessor :foo
    foo = 'foo'
  end
end

p A.foo # => "nil"

class A
  class << self
    attr_accessor :foo
  end
  self.foo = 'foo'
end

p A.foo # => "foo"

这和When to use 'self' in Ruby不是同一个问题

需要明确的是,我不是在问何时使用 self.我在问为什么我不能在 'class

【问题讨论】:

标签: ruby class-variables attr-accessor


【解决方案1】:

你的第二个例子不是一个类变量,它是这个类的一个类实例变量,证明如果你像这样继承你会得到 nil

class A
  class << self
    attr_accessor :foo
  end
  self.foo = 'foo'
end

class B < A
end

B.foo # => nil

所以如果你想在class &lt;&lt; self中添加一个类变量你可以使用@@

class A

  class << self
  @@foo = :foo
    def foo
      @@foo
    end
  end
end

【讨论】:

  • 我想使用 attr_accessor 的原因是因为我希望子类具有不同的 foo 值。而这是,如果我在子类中更改 foo 它也会更改 A.foo 的值
  • 所以你的意思是它是一个类实例变量,对吧?
  • 嗯,我想是的。说起来有点好笑,但它确实完成了工作。