Ruby报错求助:'cannot be used in conjunction (ArgumentError)'
搞定你的Ruby代码错误!
嘿,我来帮你排查这个ArgumentError: cannot be used in conjunction的问题,顺便把代码里的其他小问题也一起修复了:
1. 触发错误的核心原因:JSON.load参数冲突
Ruby的JSON.load方法有个小坑——它不能同时接收第二个proc参数和第三个options哈希参数。你现在写的JSON.load(file, nil, symbolize_names: true)里,把nil当proc传进去,又加了symbolize_names的选项,这俩参数凑一起就触发了这个错误。
解决这个很简单,要么换成更常用的JSON.parse(推荐,语法更清晰),要么把多余的nil删掉:
# 推荐写法:用JSON.parse直接加选项 JSON.parse(file, symbolize_names: true) # 或者调整JSON.load的写法,去掉nil JSON.load(file, symbolize_names: true)
2. 藏在代码里的拼写错误
你把permissions(权限)拼成了permisisons,两处都要改:
- 类方法名:
self.permisisons_from_template→self.permissions_from_template - 初始化方法里的调用:
User.permisisons_from_template→User.permissions_from_template
这个拼写错误如果没改,运行的时候还会报“找不到方法”的错误哦。
3. 补全未写完的save方法
你的save方法里.to_...明显没写完,应该是.to_json。我给你补全了保存到文件的逻辑,这样实例就能把自己存成JSON文件了:
def save self_json = {email: @email, name: @name, permissions: @permissions}.to_json # 把邮箱里的特殊字符替换掉,避免文件名出错 filename = "#{@email.gsub('@', '_').gsub('.', '_')}_user.json" File.write(filename, self_json) end
修正后的完整代码
require 'json' class User attr_accessor :email, :name, :permissions def initialize(*args) @email = args[0] @name = args[1] @permissions = User.permissions_from_template end def self.permissions_from_template file = File.read 'user_permissions_template.json' JSON.parse(file, symbolize_names: true) end def save self_json = {email: @email, name: @name, permissions: @permissions}.to_json filename = "#{@email.gsub('@', '_').gsub('.', '_')}_user.json" File.write(filename, self_json) end end
额外小建议
你用*args来初始化的话,如果传入的参数不够2个,@email或@name会变成nil,可以改成给参数加默认值的写法,这样调用起来更灵活:
def initialize(email = nil, name = nil) @email = email @name = name @permissions = User.permissions_from_template end
比如User.new('test@example.com')或者User.new都能正常运行啦。
内容的提问来源于stack exchange,提问作者Wade73
相关产品推荐
相关产品推荐

