module M
def self.prepended(clz)
clz.class_eval do
def [](k)
p 1
end
end
end
end
module N
def self.included(clz)
clz.class_eval do
def []=(k, v)
p 2
end
end
end
end
class Hash
prepend M
include N
end
Hash.new[1]
Hash.new[1]=1
这段代码执行的时候什么也没有输出,按我的理解,应该会输出 1 2。 但是我的 prepend 模块并没有方法,只是利用了一下钩子,为什么 eval 里覆写的方法会失效?而且 prepend 导致 include 的覆写也失效了。 如果注释掉 prepend M,[]=的覆写是可以生效的,整段用 included 写的话是完全可行的。 我觉得这里和方法查找链不应有联系,但是我也想不到 prepend 和 include 的其他区别了。