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

(メソッドが目的のモジュールの名前でget_module_name_from_config_filea を返すと仮定します - ここでは または のいずれかです。)String"M1""M2"

しかし、私はこれを取得します:

error: wrong argument type String (expected Module).

m型の為String、無いModule、明らかに。mシンボルでも試してみましたが、同じ問題が発生します(エラーメッセージで置き換えStringてください)。Symbol

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

前もって感謝します。

4

1 に答える 1

5

const_getこのようにすることができます( Jörg W Mittagの提案に従って使用するように変更されました)

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

上記のコードにエラーがありましたが、小文字classにする必要があります。module

于 2012-07-03T23:52:45.583 に答える