我做了一个试图了解单身人士如何工作的实验。
我不明白为什么我们用@@而不是@来为类变量添加前缀?如下所述,如果变量是与类定义内联创建的,则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
答案 0 :(得分:3)
如果变量是使用类定义内联创建的,则self被定义为Test,而变量是一个类变量是否正确?
没有。它是类的实例变量。它不是类变量。
实例变量仅对该实例可见。类变量对于类,其他祖先类及其实例是可见的。
@var
是为Test
(Class
类的实例)定义的。它不是Test
的祖先类可见,也不是它们的实例。@@var
是为Test
及其祖先类及其实例定义的。它们共享相同的@@var
。@var
是针对Test
的某个实例(其本身不是Test
)定义的。 Test
以及Test