鉴于以下代码,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"
答案 0 :(得分:4)
您在单例类级别声明变量并尝试在类级别上访问它。调试输出是你的朋友:
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
的调用时才打印后者。
答案 1 :(得分:2)
Dog.speak
如何回归"here is the @var variable"
出于同样的原因,原因如此:
class Dog
@var = "here is the @var variable"
def speak
@var
end
end
Dog.new.speak # => nil
您在类级别设置变量,并期望它在实例级别上可用。