如何使用名称在参数中给出的模块扩展ruby中的对象?

时间:2012-07-03 23:21:21

标签: ruby inheritance

我想用一个模块扩展一个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_file返回带有所需模块名称的String - 此处为"M1""M2"。)

但我明白了:

error: wrong argument type String (expected Module).

因为m类型为String,而不是Module。我尝试将m作为符号,但我遇到了同样的问题(在错误消息中将String替换为Symbol。)

那么,我可以将m转换为Module类型的内容吗?或者还有另一种方法可以达到这个目的吗?

提前致谢。

1 个答案:

答案 0 :(得分:5)

您可以这样做(根据JörgWMittag的建议修改为使用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

您的代码中有一些错误,btw - classmodule应为小写。