为什么我们在ruby中使用@@为类变量添加前缀?

时间:2013-05-28 06:29:04

标签: ruby-on-rails ruby class singleton metaprogramming

我做了一个试图了解单身人士如何工作的实验。

我不明白为什么我们用@@而不是@来为类变量添加前缀?如下所述,如果变量是与类定义内联创建的,则self被定义为Test,变量是一个类变量是否正确?然后我们可以在单例类定义中使用attr_accessor来访问它。初始化中的@var似乎是不同的,因为self在初始化时在上下文中设置为t,因此var在该上下文中属于t?

这一切都非常令人困惑,任何帮助都会受到赞赏。

class Test
  @var = 99
  attr_accessor :var

  def initialize
    @var = "Whoop" #if this is commented, pri doesn't print anything.
  end

  def pri
    puts @var
  end

  class << self
    attr_accessor :var
  end
end

t = Test.new
puts Test.var # Outputs 99
Test.var = 5
puts Test.var # Outputs 5
puts t.pri # Outputs Whoop

1 个答案:

答案 0 :(得分:3)

  

如果变量是使用类定义内联创建的,则self被定义为Test,而变量是一个类变量是否正确?

没有。它是类的实例变量。它不是类变量。

实例变量仅对该实例可见。类变量对于类,其他祖先类及其实例是可见的。

    第2行中定义的
  • @var是为TestClass类的实例)定义的。它不是Test的祖先类可见,也不是它们的实例。
  • @@var是为Test及其祖先类及其实例定义的。它们共享相同的@@var
  • 第6行中定义的
  • @var是针对Test的某个实例(其本身不是Test)定义的。 Test以及Test
  • 的其他实例均无法看到它