2012-01-01 10 views
5

これは、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がクラスのインスタンス(私には新しさ)のインスタンスメソッドを定義する方法を理解できないと思います。それをクラスのインスタンスメソッド(古典言語)として定義します。

私はこの問題は、あなたの出力は、実行の実際の順序を反映していないということです

+1

Iの戻り値と共にb.method_missingの文字列を出力

  • 最外puts
  • が実行されると呼ばれるb.fooシングルトン方法、上で見た最初の行問題をより明確にするために無関係のコードを削除しました。一般的に、問題の最小例を提供することは良い考えです。 –

    答えて

    4

    ...多分私の頭はまだ昨夜から回転している、この質問は理にかなって願っています。出力を見てみましょう:一見

    method_missing (bar) on b. Redeirecting to b.foo 
    method_missing (bar) on b. Calling super 
    

    、これはB#method_missingはあなたが記述二つの質問を提起シングルトンメソッドb.method_missing前に呼び出されるような印象を与えます。実際には、b.method_missingが最初に正しく呼び出されます。

    1. bは何の方法barを持っていないので、b.method_missingは、引数として文字列'bar'と呼ばれている:あなたは声明puts b.barが評価されるかを見ればこれは明らか取得します。
    2. b.method_missingは、キーワードを使用して、B#method_missingメソッドを呼び出します。
    3. B#method_missing
    4. を出力する putsを使用
    5. b.foo
    +2

    +1;私にそれを打つ。 –

    +0

    Niklas、無関係なコードを明確にしてくれてありがとう。あなたの答えをありがとう! – dynex

    +0

    デバッガでそれを実行することはもちろん明らかです。私はそれを始めるにはすべきでした - ごめんなさい、あなたの忍耐に感謝します。 – dynex

    関連する問題