加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 03:14:37 所属栏目:百科 来源:网络整理
导读:我想用一个模块扩展一个 Ruby对象,但我希望能够在运行时更改要使用的模块,并且能够通过对象改变它.换句话说,我想传递模块的名称作为参数扩展.我怎样才能做到这一点? 我尝试了以下方法: module M1endmodule M2endclass C def initialize module_to_use exte
我想用一个模块扩展一个 Ruby对象,但我希望能够在运行时更改要使用的模块,并且能够通过对象改变它.换句话说,我想传递模块的名称作为参数扩展.我怎样才能做到这一点?

我尝试了以下方法:

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替换String).

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

提前致谢.

解决方法

您可以这样做(根据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 – 类和模块应该是小写的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读