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_file返回String带有所需模块名称的 a - 此处为"M1""M2"。)

但我明白了:

error: wrong argument type String (expected Module).

因为m是 type String,不是Module,很明显。我也尝试将它m作为一个符号,但我遇到了同样的问题(在错误消息中替换为)StringSymbol

那么,我可以转换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 回答