Ruby在对象中查找类变量,而不是特定的类

Ruby在对象中查找类变量,而不是特定的类,ruby,eigenclass,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 #

这部分工作:

 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
,而不是在
示例中查找

我已经在Ruby 1.9.3和2.0中测试了这段代码,得到了相同的结果

为什么会发生这种情况?

第二件事,我们可以关闭它吗(因此
example.get\u var1
不会在对象中查找类变量)

类变量查找的词法范围似乎有点古怪。就我所知,因为你不在

class Example1
end
块,ruby不会在类中查找@var,而是从对象中查找。如果要从类中显式地使用它,可以执行以下操作:

def example1.get_var
    self.class.class_variable_get(:@@var1)
end

我在寻找答案时偶然发现了这个问题。他们说的是1.8.7,但它似乎也适用于更高版本。

我同意。在本例中,单例方法定义是词汇范围的,周围的类是
对象。这与类重新打开的行为相同。如果您需要直接访问祖先类变量,只需将单例定义封装在父类范围内,或者按照SomeGuy的建议使用间接
class\u variable\u get
。官方术语是@Max谢谢,您是对的,但是eigenclass或元类在Ruby社区中被广泛使用,至于标记,
singleton
用于singleton模式。所以,我看不出这里有什么问题。没错,但我认为这些术语主要是Ruby 1.9之前的发明,当时添加了
Object\singleton\u类。我看到有多少人仍在使用
def元类,这让我非常痛苦;班