Ruby跨模块NoMethodError问题:模块方法调用失败求助
Ruby模块方法调用错误的解决方案
你遇到的NoMethodError核心原因是方法定义与调用方式不匹配:
- 你在
Utilities里定义的file_search是实例方法,这类方法需要模块被混入到类/模块后,通过实例(或模块自身,若用extend)调用; - 而你直接用
Utilities.file_search()的方式,是在尝试调用模块方法(绑定到模块本身的方法),两者不属于同一范畴,自然找不到对应方法。
以下是两种针对性的解决方案:
方案1:将方法改为模块方法(直接通过模块调用)
如果希望直接用Utilities.file_search()调用,有两种修改方式:
方式A:直接定义模块方法
给方法加上self.前缀,让它直接绑定到Utilities模块本身:
module Utilities def self.file_search() # some code return x end end module Remake_Components require 'csv' # 若不需要将该方法混入为实例方法,可去掉include Utilities f = Utilities.file_search() # 现在能正常调用 end
方式B:用module_function兼容实例/模块方法
如果需要同时保留实例方法(供其他类/模块include使用)和模块方法调用能力,可添加module_function声明:
module Utilities def file_search() # some code return x end module_function :file_search # 将该方法转为模块方法,同时保留实例方法版本 end module Remake_Components require 'csv' include Utilities f = Utilities.file_search() # 正常调用模块方法 end
方案2:通过混入后调用实例方法
如果想保留file_search作为实例方法,在Remake_Components内部调用的话,用extend替代include——extend会把模块的实例方法转为当前模块的模块方法:
module Utilities def file_search() # some code return x end end module Remake_Components require 'csv' extend Utilities # 用extend替代include,将实例方法转为模块自身的方法 f = file_search() # 直接调用,或用Remake_Components.file_search() end
内容的提问来源于stack exchange,提问作者Ben Garcia DB Solutions
相关产品推荐
相关产品推荐

