【发布时间】:2014-11-11 03:45:50
【问题描述】:
根据文档mod.const_get(sym)“返回mod中命名常量的值。”
我也知道const_get默认会查找receiver的继承链。所以以下工作:
class A; HELLO = :hello; end
class B < A; end
B.const_get(:HELLO) #=> :hello
我也知道 Ruby 中的类是 Object 的子类,因此即使接收者是普通类,您也可以使用 const_get 查找“全局”常量:
class C; end
C.const_get(:Array) #=> Array
但是,这就是我感到困惑的地方——模块不继承Object。那么为什么我仍然可以使用const_get 从模块中查找“全局”常量?为什么以下工作?
module M; end
M.const_get(:Array) #=> Array
如果文档正确 - const_get 只需查找在接收器或其超类下定义的常量。但是在上面的代码中,Object 不是M 的超类,那么为什么可以查到Array 呢?
谢谢
【问题讨论】:
-
请注意,这与
::的行为不符。SomeModule::SomeGlobalConstant会导致错误,而SomeModule.const_get(:SomeGlobalConstant)会起作用。
标签: ruby