2012-07-03 4 views
5

Rubyオブジェクトをモジュールで拡張したいのですが、実行時に使用するモジュールを変更し、オブジェクトごとにこれを変更する機能が必要です。言い換えれば、モジュール名をextendにパラメータとして渡したいと思います。これどうやってするの?名前はパラメータで指定されたモジュールでルビのオブジェクトをどのように拡張できますか?

私は次のことを試してみました:

module M1 
end 

module M2 
end 

class C 
    def initialize module_to_use 
    extend module_to_use 
    end 
end 

m = get_module_name_from_config_file 
c1 = C.new m 

-

しかし、私はこの取得:

を(必要なモジュールの名前で Stringを返す get_module_name_from_config_fileその方法と仮定すると、ここに "M1""M2"のいずれか。)
error: wrong argument type String (expected Module). 

mStringであり、ではないためです、明らかに。私もmをシンボルとして使用しようとしましたが、同じ問題が発生します(エラーメッセージのStringSymbolに置き換えてください)。

mをタイプModuleに変換できますか?それとも私はこれを達成する別の方法がありますか?

ありがとうございます。

+0

const_getでこのようなことはできますか? http://stackoverflow.com/questions/2361347/how-to-convert-a-string-to-a-constant-in-ruby – jstim

答えて

5

あなたはこの(イェルクWミッタークの提案につきconst_getを使用するように変更)

module M1 
end 

module M2 
end 

class C 
    def initialize module_to_use 
    extend module_to_use 
    end 
end 

m = Module::const_get("M1") 
c1 = C.new m 

あなたはところで、上記のコード内のいくつかのエラーを持っていたようにそれを行うことができます - classmodule小文字でなければなりません。

+2

しないでください。ここでは 'eval'を使う必要は全くありません。ちょうど 'const_get'を使用してください。 –

+0

@JörgWMittag:申し訳ありません。一定。 – Peter

+0

ありがとう、それは完全に動作します。元の質問でも大文字を修正しました。 –

関連する問題