2012-07-09 3 views
18

これがなぜ機能するのか分かりません。Ruby:モジュールとスーパー?

module Base 
    attr_reader :first 
    def setup 
    @first = 1 
    end 
end 

module Addon 
    attr_reader :second 
    def setup 
    #super 
    @second = 2 
    end 
end 

class Test 
    include Base 
    include Addon 

    def initialize(num) 
    @num = num 
    setup 
    end 
end 

a = Test.new(1) 
p a.first 
p a.second 

基本的に私はいくつかのものを設定する "基本"モジュールを持っています。私はまた、いくつかのクラスがそれを含めることを望む場合、いくつかのものを設定するアドオンモジュールを持っています。今

私はそれをテストし、私はそのスーパーコールを持っていない場合、私はスーパーコールを持っているとき、私はスーパー実際に何

1 
2 

を取得

nil 
2 

を取得ここでやる? BaseとAddonが関連していなくても、Baseモジュールからsetupメソッドを呼び出しています。

モジュールのコンテキストでsuperを使用したのはこれが初めてです。以前はクラスでスーパーコールを使用していましたが、同じメソッドを持つ親を見つけるために継承ツリーを上に行くだけだと思っていました。

複数のモジュールを含めて、ある種の継承ツリーも設定していますか?

EDIT:コンテキストの場合、AddonモジュールはBaseモジュールなしでは含まれず、Baseモジュールは常に追加のAddonモジュールの前に含まれます。

+0

あなたは正しいと思います。メソッドのシグネチャはおそらくスタックに格納され、superはスタック内のオブジェクトにメッセージを送ります。興味深い発見私は言うだろう! – Candide

答えて

23

はい、あなたはモジュールを含む場合、それらは含ま継承チェーン

Test.ancestors # => [Test, Addon, Base, Object, Kernel, BasicObject] 

Addonモジュールに注入され、Baseから既存のsetup方法を再定義します。 Baseのバージョンを呼びたい場合は、superを使用してください。

関連する問題