Ruby Gem测试失败:Module未定义new方法问题求助
解决Ruby Gem中NoMethodError: undefined method 'new'的问题
嗨,我来帮你搞定这个棘手的小问题!
你遇到的NoMethodError: undefined method 'new' for myGemName:Module错误,核心原因很简单:你把myGemName定义成了模块(Module),但只有类(Class)才能用new方法实例化。模块在Ruby里是不能被实例化的,它主要用来做代码复用(比如Mixin)或者存放工具方法,没有构造器initialize的概念——你写的initialize方法在模块里根本不会被当作实例化的入口。
最直接的解决方案:把模块改成类
如果你本来就想创建一个可以实例化的对象,那只需要把代码里的module关键字改成class就行,这样你的initialize方法就会作为类的构造器正常工作:
# 注意Ruby惯例:类名要用大驼峰(首字母大写,每个单词首字母大写) class MyGemName # 如果你需要外部能访问variable,也可以用attr_accessor attr_writer :variable def initialize(my_variable = false) self.variable = my_variable if my_variable end end
改完之后,不管是在测试里还是irb中,执行t = MyGemName.new就不会报错了,传入参数MyGemName.new(true)也能正常设置变量。
如果确实需要用模块怎么办?
要是你设计这个gem的时候就是想用模块(比如做工具类、或者给其他类注入方法),那你得调整使用方式:
- 作为工具模块,直接调用类方法:
module MyGemName def self.set_variable(my_variable = false) # 这里写你的逻辑,比如存储变量或者执行操作 @variable = my_variable if my_variable end def self.get_variable @variable end end # 调用方式:直接用模块名调用方法 MyGemName.set_variable(true) puts MyGemName.get_variable # 输出 true
- 作为Mixin,注入到其他类中:
module MyGemName attr_writer :variable def initialize(my_variable = false) self.variable = my_variable if my_variable end end # 把模块包含到你需要的类里 class MyCustomClass include MyGemName end # 实例化这个类,就能使用模块里的方法了 t = MyCustomClass.new(true)
小提醒:Ruby命名惯例
顺便提一句,Ruby里类和模块的命名规范是大驼峰(PascalCase),比如MyGemName而不是myGemName,这样不仅符合社区惯例,也能避免和小写的局部变量、方法名混淆哦。
内容的提问来源于stack exchange,提问作者user101289
相关产品推荐
相关产品推荐

