我在 Ruby 中发现了一个奇怪的地方。当内核定义相同的方法时,使用method_missing
/动态处理通过失败respond_to_missing?
发起的方法调用:__send__
class Testerize
def method_missing(method, *args, &block)
if method == :system
puts 'yay'
else
super
end
end
def respond_to_missing?(method, internal)
return true if method == :system
end
end
t = Testerize.new
puts t.respond_to?(:system)
# Prints true
t.system
# Prints 'yay'
t.__send__(:system)
# Exception: wrong number of arguments (ArgumentError)
Kernel.system
不知何故混入其中。有谁知道这里发生了什么?我原以为:system
“消息”会发布到 Testerize 实例, hitmethod_missing
和瞧。为什么method_missing
在使用直接调用__send__
时我没有被调用?
如果相关的话,我正在使用 Ruby 1.9.3。