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 インスタンスに投稿され、ヒットし、出来上がりを期待していたでしょうmethod_missing。直接呼び出しを使用しているときmethod_missingに使用すると呼び出されないのはなぜですか?__send__
関連する場合は、Ruby 1.9.3 を使用しています。