如果我创建:
class Test1
A = 4
end
class Test2 < Test1
end
Test2.constants
返回[:A]
,因为它从A
派生Test1
。 Array.constants
为[]
,即使其超类为Object
且Object.constants
有多个值。 Array
怎么没有得出这些值?
答案 0 :(得分:1)
正如您在Object.constants
中看到的那样,Ruby中的所有顶级常量都会添加到Object中。这样做的好处是每个类都继承自Object,因此所有顶级常量始终可用(正如您可能直观地预期的那样)。
现在假设Module#constants
按预期工作:每个类列出它从Object
继承的顶级常量。真是太痛苦了!我们会经常写Foo.constants - Object.constants
,意思是“除了那些无关紧要的常数之外的常数”。
Ruby设计师想到了这个令人头痛的问题,并为rb_mod_const_of
添加了一个特殊的例外 - 用于遍历继承链并找到常量的C函数:
if (tmp == rb_cObject && mod != rb_cObject) break;
即。如果我们已经在继承链中达到Object
,并且我们不是在寻找Object
本身的常量,那就停止寻找。