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

Pet*_*wis 5 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
Run Code Online (Sandbox Code Playgroud)

(假设该方法get_module_name_from_config_file返回String带有所需模块名称的a - 这里"M1"或者"M2".)

但我明白了:

error: wrong argument type String (expected Module).
Run Code Online (Sandbox Code Playgroud)

因为m是类型String,不是Module,显然.我试了一下m是一个符号太多,但我得到了同样的问题(更换StringSymbol错误消息).

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

提前致谢.

Pet*_*ter 5

您可以这样做(const_get根据JörgWMittag的建议进行修改)

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
Run Code Online (Sandbox Code Playgroud)

你上面的代码中有一些错误,顺便说一下 - class并且module应该是小写的.

  • 请不要.这里绝对没有必要使用`eval`.只需使用`const_get`即可. (2认同)