看起来const_missing
是Object
的实例方法。如果是这样,为什么这段代码不起作用?
module Extensions
def const_missing(c)
puts c
end
end
class Object
include Extensions
end
NonExistent.new
为了让它正常运行,我必须将def const_missing
更改为def Object.const_missing
。为什么呢?
答案 0 :(得分:2)
这只是在Ruby中解析方法调用的方式的结果。
首先,检查单例方法。然后是类的实例方法,然后是祖先(它们将是包含的模块,然后是包含其模块的超类)。
所以你可以直接定义Object.const_missing
,或者将你的模块包含在Object的单例类中:
class << Object
include Extensions
end
NonExistent # => prints "NonExistent"
你也可以monkeypatch Module#const_missing
。