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元类,这让我非常痛苦;班