为什么const_missing没有用Object作为前缀?

时间:2011-05-21 21:41:19

标签: ruby metaprogramming

看起来const_missingObject的实例方法。如果是这样,为什么这段代码不起作用?

module Extensions
  def const_missing(c)
    puts c
  end
end

class Object
  include Extensions
end

NonExistent.new

为了让它正常运行,我必须将def const_missing更改为def Object.const_missing。为什么呢?

1 个答案:

答案 0 :(得分:2)

这只是在Ruby中解析方法调用的方式的结果。

首先,检查单例方法。然后是类的实例方法,然后是祖先(它们将是包含的模块,然后是包含其模块的超类)。

所以你可以直接定义Object.const_missing,或者将你的模块包含在Object的单例类中:

class << Object
  include Extensions
end

NonExistent # => prints "NonExistent"

你也可以monkeypatch Module#const_missing