2012-01-15 8 views
0

オブジェクトが最初から実行されたとしても、後続のコードブロックを無視する方法がわかりにくいです。それが探しているオブジェクトのメソッドルックアップパス(モジュールとメソッドのオーバーライド)

方法は、各モジュール上にある

class A 
    include B,C,D,B 
end 

ルビが側モジュール名の配列を保持しない(それは明らかDを呼び出すように)?

Rubyは実際にクラスに含まれているモジュールを記憶し、メソッドのルックアップ・パスにこれらのモジュールをマージ...

答えて

2

は、私はあなたの質問を理解して100%ではないが、私は自分のベストを尽くします。 A.included_modules

含まれるモジュールのメソッドは、現在のクラスで定義されているモジュールの上に置かれます。この例を参照してください:

class X 
    def foo 
    puts 'Hi from X' 
    end 
end 

module AnotherFoo 
    def foo 
    puts "Hi from AnotherFoo" 
    super 
    end 
end 

class Y < X 
    include AnotherFoo 
end 

y = Y.new 
y.foo 
# Hi from another foo 
# Hi from X 

class Y < X 
    include AnotherFoo 
    def foo 
    puts "Hi from Y" 
    super 
    end 
end 

y.foo 
# Hi from Y 
# Hi from another foo 
# Hi from X 

メソッドの解決順序は、子クラス - >含まれるモジュール - >親クラスです。また、モジュールは常に1回だけ含まれていることがわかります。したがって、クラスにすでにモジュールが含まれている場合、そのモジュールは再度組み込まれません。

+0

A.included_modules?私にはうまくいきました。ルビーはモジュール名の配列を保持しています。ここで最初に行うことは、この配列のすべての要素を調べて何か問題があるかどうかを確認することです。ありがとう! –

+0

「何かが間違っている」とはどういう意味ですか? Rubyは明確なメソッド解決順序を持っています。その名前を言い表すときに呼び出す実際の関数を見つけるために使用するアルゴリズムを意味します。そして私が言ったように、順序はクラス - >含まれるモジュール(順番に試された) - >親クラスです。これらのメソッドの1つに、定義された名前のメソッドが含まれている場合は、そのメソッドが使用され、検索がアボートされます。 –

+0

確かに、何かが間違っているかもしれないと言って、私は何かが間違っているということを言及していません、私はちょうどそれが何らかのメッセージに応答すればモジュールを尋ねる瞬間になると、あなた自身がinclude_modulesに尋ねて、以前に言ったようにsometingを実行します。 '含まれているモジュールは再導入されません。'これで、メソッドルックアップのパスについて他の部分は分かりましたが、 。それはちょうど私はこれらのすべてのモジュールを宣言しました –

関連する問題