Ruby在Object中寻找类变量而不是特定的类

时间:2014-07-01 12:59:36

标签: ruby eigenclass

这部分有效:

 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中查找类变量)吗?

1 个答案:

答案 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,但它似乎也适用于更高版本。