Ruby CSV解析链式调用方法触发Integer无对应方法报错如何解决?
问题原因与修复方案
核心原因
你定义的modele_fill、cat_fill、solve三个实例方法未显式返回调用对象本身,Ruby中方法默认返回最后一行执行表达式的结果:这三个方法最后一行都是带块的CSV.parse调用,该调用返回值为整数类型的解析行数,而非Super_hash类的实例对象。
当执行su = Super_hash.new.modele_fill(MODELE_DOCUMENT)时,su变量实际被赋值为CSV解析返回的整数,而非Super_hash实例,后续调用su.cat_fill时自然会触发「整数对象不存在对应方法」的报错。方法单独运行时你没有用到返回值,仅修改实例内部变量,因此不会触发异常。
修复方案
方案1:支持链式调用
在三个实例方法的末尾统一添加一行self,让方法执行完成后返回当前实例对象,即可支持链式调用,修改后的方法结构参考如下:
def modele_fill(document_csv) # 原有代码逻辑完全不变 files = CSV.parse(File.read(document_csv), headers: true) do |file| # 原有块内处理逻辑完全不变 end # 新增以下行返回当前实例 self end def cat_fill(csv_item_file) # 原有代码逻辑完全不变 file = CSV.parse(File.read(csv_item_file), headers: true) do |file| # 原有块内处理逻辑完全不变 end self end def solve(pb_csv) # 原有代码逻辑完全不变 file = CSV.parse(File.read(pb_csv), headers: true) do |file| # 原有块内处理逻辑完全不变 end self end
修改完成后你原有链式调用的代码即可正常运行。
方案2:拆分调用无需修改方法
如果你不需要链式调用的写法,也可以直接拆分调用语句,不需要修改类内部方法即可正常运行:
su = Super_hash.new su.modele_fill(MODELE_DOCUMENT) su.cat_fill(CATEGORIE_DOCUMENT) su.solve(PROBLEME_DOCUMENT)
这种写法没有用到方法的返回值,直接通过实例对象调用所有方法,不会触发类型错误。
内容的提问来源于stack exchange,提问作者davidzzz
相关产品推荐
相关产品推荐

