这部分有效:
class Example1
@@var1= "var1 in the Example1"
def get_var1
@@var1
end
end
example1 = Example1.new
example1.get_var1
# => "var1 in the Example1"
但如果我尝试eigenclass:
def example1.get_var1
@@var1
end
example1.get_var1
# NameError: uninitialized class variable @@var1 in Object
# from (pry):128:in `get_var1'
Ruby在@@var1
而不是Object
中查找Example
。
我已经在Ruby 1.9.3和2.0中测试了这个代码并得到了相同的结果。
为什么会这样?
第二件事,我们可以将其关闭(因此example.get_var1
不会在Object中查找类变量)吗?
答案 0 :(得分:7)
似乎类变量查找的词法范围有点古怪。尽可能接近,因为你不在
之内class Example1
end
阻止,ruby不会在你的类中查找@@ var,而是从Object查找。如果你想从你的班级中明确地想要它,你可以这样做:
def example1.get_var
self.class.class_variable_get(:@@var1)
end
我在寻找答案时偶然发现了https://www.ruby-forum.com/topic/1228428。他们谈论的是1.8.7,但它似乎也适用于更高版本。