2011-11-12 6 views
3

拡張時に呼び出されるもの。ruby​​モジュールにはコンストラクタがありますか?

例:コードのこの作品:

module M 
    def init(x) 
    @x = 5 
    self 
    end 
    def foo 
    super 
    puts @x 
    end 
end 
class D 
    def foo 
    puts 1 
    end 
end 

D.new.extend(M).init(5).foo 

作品や1〜5を返します。しかし、私は

D.new.extend(M.init(5)).foo 

以上を読み取るために、まだ

D.new.extend(M(5)).foo 

ないからバグを防ぐために、最後の行を変更したいです@xを設定します。同様のノートで

、私はあなたがモジュールを返すメソッドを持つことによってそれを行うことができます

class X 
    include Debug(5) 

答えて

1

ような何かを言うことができます。

def M(par) 
    m = Module.new 
    m.module_eval %Q{ 
    def foo 
     super 
     puts #{par} 
    end 
    } 
    m 
end 

D.new.extend(M(5)).foo # => 5 

class X 
    include M(4) 
end 

X.new.foo # => 4 
+0

これは、モジュールの編集に苦労します。モジュール内部でこれを行う方法はありますか?例えば、 。モジュールM; def self.init(x); new_mod = M; ここにnew_modの#doの何か; new_mod; end; end; – alexloh

+0

あなたは上記の方法を取ることができ、この種の治療を必要とするメソッドを作成するためにのみ使用することができます。したがって、 'Module.new'の代わりに、以前に書いた既存のモジュールで' module_eval'を呼び出すことができます。しかし、あなたの質問に直接答えるには:いいえ、モジュールにはコンストラクタがありません。 –

関連する問題