为什么Array.constants没有显示Object类中的常量列表?

时间:2014-06-10 21:26:25

标签: ruby inheritance constants

如果我创建:

class Test1
  A = 4
end

class Test2 < Test1
end

Test2.constants返回[:A],因为它从A派生Test1Array.constants[],即使其超类为ObjectObject.constants有多个值。 Array怎么没有得出这些值?

1 个答案:

答案 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本身的常量,那就停止寻找。