gpt4 book ai didi

ruby - 出现错误 - "cannot be used in conjunction (ArgumentError)"Ruby

转载 作者:数据小太阳 更新时间:2023-10-29 07:45:55 26 4
gpt4 key购买 nike

我正在学习 Ruby 类(class),在运行其中一个示例时遇到错误。这是我的 Ruby 类:

require 'json'

class User

attr_accessor :email, :name, :permissions

def initialize(*args)
@email = args[0]
@name = args[1]
@permissions = User.permisisons_from_template
end

def self.permisisons_from_template
file = File.read 'user_permissions_template.json'
JSON.load(file, nil, symbolize_names: true)
end

def save
self_json = {email: @email, name: @name, permissions: @permissions}.to_json
open('users.json', 'a') do |file|
file.puts self_json
end
end

end

我的运行者文件代码如下所示:

require 'pp'
require_relative 'user'

user = User.new 'john.doe@example.com', 'John Doe'

pp user

user.save

当我运行此命令“ruby runner.rb”时出现此错误:

/usr/local/rvm/rubies/ruby-2.4.1/lib/ruby/2.4.0/json/common.rb:156:in `initialize': options :symbolize_names and :create_additions cannot be  used in conjunction (ArgumentError)
from /usr/local/rvm/rubies/ruby-2.4.1/lib/ruby/2.4.0/json/common.rb:156:in `new'
from /usr/local/rvm/rubies/ruby-2.4.1/lib/ruby/2.4.0/json/common.rb:156:in `parse'
from /usr/local/rvm/rubies/ruby-2.4.1/lib/ruby/2.4.0/json/common.rb:335:in `load'
from /home/ec2-user/environment/section2_project/user.rb:15:in `permisisons_from_template'
from /home/ec2-user/environment/section2_project/user.rb:10:in `initialize'
from runner.rb:4:in `new'
from runner.rb:4:in `<main>'

我在网站上寻求帮助,建议的解决方法是删除 nil 参数。现在,我有 .Net 背景,我推测我可以使用 proc: nil 并且它也能正常工作,它确实做到了。我的假设是它不喜欢命名参数和位置参数的混合,但这不是 .Net,所以我的猜测可能只是幸运。该站点的版主不确定为什么代码失败以及为什么删除 nil 可以解决问题。所以,我的问题是:

为什么行 JSON.load(file, nil, symbolize_names: true) 失败了,但是 JSON.load(file, proc: nil, symbolize_names: true)工作?谢谢。

韦德

最佳答案

这里发生的事情是参数没有按照您期望的方式进行解析。 Ruby 中有一个特性,参数列表末尾的任何 key: value 都被制成一个 Hash,而无需将 {} 在他们周围。

例如,如果您编写一个方法:

def load(source, options = {})
end

这可以称为 load(source),在这种情况下 options 将是 {},或者类似于 load (source, foo: 5, bar: true) 在这种情况下 options 将是 {foo: 5, bar: true}

另一个细节是从左到右填充具有默认值的可选参数。

为什么这很重要?

嗯,在 JSON.load(file, proc: nil, symbolize_names: true) 的情况下,proc: nil, symbolize_names: true 成为哈希 {proc: nil, symbolize_names: true} 然后这会填充参数列表中的 proc 位置,将 options 参数保留为其默认值。也就是说,您实际上并没有设置 symbolize_names: true,而您以为自己是。

JSON.load(file, nil, symbolize_names: true) 的情况下,nil 填充 proc 参数的值,并且 symbolize_names: true 变为 options。这与 JSON 库中的默认选项结合以提供完整的选项集,{:max_nesting=>false, :allow_nan=>true, :allow_blank=>true, :create_additions=>true, :symbolize_names= >true 然后包含错误消息引用的冲突。

关于ruby - 出现错误 - "cannot be used in conjunction (ArgumentError)"Ruby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50090273/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com