Class 变量在 class << self 中使用 attr_accessor

Class variable using attr_accessor inside class << self

有人可以解释为什么 self.foo= 在 class << self 之外工作,而 foo= 在 class << self.

内不起作用
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 << self' 块内设置 class 变量,但我可以在它之外设置。

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

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

class B < A
end

B.foo # => nil

因此,如果您想在 class << self 中添加一个 class 变量,您可以使用 @@

class A

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