我想用一个模块扩展一个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
类型的内容吗?或者还有另一种方法可以达到这个目的吗?
提前致谢。
答案 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 - class
和module
应为小写。