これは、articleに触発されてRubyメソッド呼び出し階層で遊んでいて、奇妙なことに気付いた。Rubyメソッド呼び出し階層
は考える:
class B
def foo
"- Instance method defined by B"
end
def method_missing(method)
puts "- method_missing (#{method}) on b. Redirecting to b.foo\n"
foo
end
end
b = B.new
def b.foo
"- Method defined directly on an instance of B\n" + super
end
def b.method_missing(method)
"- method_missing (#{method}) on b. Calling super\n" + super
end
puts "Calling 'bar' on b of type #{b.class}:"
puts b.bar
実行することができます:
Calling 'bar' on b of type B:
- method_missing (bar) on b. Redeirecting to b.foo
- method_missing (bar) on b. Calling super
- Method defined directly on an instance of B
- instance method defined by B
私の質問は次のとおりです。
私が呼び出しておりますのでb.bar(オブジェクト上)、クラスのインスタンスを来ますかメソッドはobjetのインスタンスメソッドが呼び出される前に呼び出されますか?
はIは、b.method_missing(method)
が最初に呼ばれることを期待しているだろう、クラスのインスタンスmethod_missing(method)
(私はスーパーを呼び出すのですか?しかし、スーパークラス階層...であるので)bar
からfoo
へのリダイレクトを行います。 また、foo
にリダイレクトされると、インスタンスのmissing_methodが呼び出されます。私たちはリダイレクトされていると言われました。
Rubyがクラスのインスタンス(私には新しさ)のインスタンスメソッドを定義する方法を理解できないと思います。それをクラスのインスタンスメソッド(古典言語)として定義します。
私はこの問題は、あなたの出力は、実行の実際の順序を反映していないということです
Iの戻り値と共に
b.method_missing
の文字列を出力puts
b.foo
シングルトン方法、上で見た最初の行問題をより明確にするために無関係のコードを削除しました。一般的に、問題の最小例を提供することは良い考えです。 –