鉴于以下代码,Dog.speak
如何不返回"here is the @var variable"
:
class Dog
class << self
@var = "here is the @var variable"
def speak
@var
end
end
end
p Dog.speak
相反,它返回nil
我的理解:class << self
打开了Dog
的单例类对象。在那个单例对象上,我们设置了@var
的实例变量。因此,我认为@var
的实例变量可以从Dog.speak
访问。
我在这里缺少什么概念?为什么@var
无法使用speak
方法?
令人困惑的是,这可以按预期工作:
class Dog
class << self
def set_it
@var = "The instance variable of @var is now accessible"
end
def speak
@var
end
end
end
Dog.set_it
p Dog.speak # => "The instance variable of @var is now accessible"
您在单例类级别上声明变量,并尝试在类级别上访问它。调试输出是你的朋友:
class Dog
class << self
puts "I am #{self}"
@var = "here is the @var variable"
def speak
puts "I am #{self}"
@var
end
end
end
打印出来:
#⇒ I am #<Class:Dog>
▶ Dog.speak
#⇒ I am Dog
请注意,在解析代码时打印前者,仅在明确执行Dog.speak
调用时打印后者。
为什么
Dog.speak
不回归"here is the @var variable"
出于同样的原因,行为相似:
class Dog
@var = "here is the @var variable"
def speak
@var
end
end
Dog.new.speak # => nil
您在类级别设置变量,并期望它在实例级别上可用。