我有以下示例:
class Test
def self.const_missing(const)
puts const
end
end
Test2 = Class.new(Test) do
CONST
end
class Test3 < Test
CONST
end
我的印象是,由于const_missing是在父类中定义的,因此CONST的调用,未定义的const将触发该方法并输出&#34; CONST&#34;。但是在上面的例子中,类Test3的行为与我的想法相似,而Test2是使用继承自Test的Class.new动态生成的。 Test2没有触发const_missing方法。它只是给了我:&#39;未初始化的CONST&#39;
我想知道原因是什么?
由于
答案 0 :(得分:3)
来自Class.new
文档:
如果给出了一个块,它将传递给该类对象,并使用
class_eval
在该类的上下文中计算该块。
让我们来看看Module#class_eval
文档(强调我的):
在 mod ,的上下文中计算字符串或块,除了在给出块时,常量/类变量查找不受影响。这可以用于将方法添加到类中。
因此,在Test2
案例中:
Test2 = Class.new(Test) do
CONST # equivalent to ::CONST
end
对于Test3
:
class Test3 < Test
CONST # equivalent to self::CONST
end
在使用Class.new
之后重新打开该类(并通过将其返回值赋值给Test2
之类的常量来命名它,然后引用未定义的常量具有您期望的行为:
Test2 = Class.new(Test)
class Test2
CONST
end
或者明确地编写路径,其中应该查找CONST
:
Test2 = Class.new(Test) do
self::CONST
end