从Ruby 2.7升级到3.0时出现ArgumentError-与位置参数和关键字参数的分离有关?
我正在尝试将gems从ruby 2.7.0升级到3.0.0。我试着提前阅读和计划我遇到的障碍,比如 我已顺利更新了两个gem,但我已开始升级第三个gem,在使用RSpec测试3.0更新时,遇到以下错误:从Ruby 2.7升级到3.0时出现ArgumentError-与位置参数和关键字参数的分离有关?,ruby,ruby-2.7,ruby-3,Ruby,Ruby 2.7,Ruby 3,我正在尝试将gems从ruby 2.7.0升级到3.0.0。我试着提前阅读和计划我遇到的障碍,比如 我已顺利更新了两个gem,但我已开始升级第三个gem,在使用RSpec测试3.0更新时,遇到以下错误: ArgumentError: wrong number of arguments (given 1, expected 0; required keyword: children) 我正在尝试通过工厂实例化一个类。堆栈跟踪指向此函数的参数: # rubocop:di
ArgumentError:
wrong number of arguments (given 1, expected 0; required keyword: children)
我正在尝试通过工厂实例化一个类。堆栈跟踪指向此函数的参数:
# rubocop:disable Style/KeywordParametersOrder
def initialize(parent_obj: nil, children:, **attributes)
@attributes = attributes
@parent = parent_obj
@children_json = children
end
# rubocop:enable Style/KeywordParametersOrder
虽然我认为这并不重要,但我已经包括了rubocop dis/enable行,以防它们很重要
工厂以这种方式调用该类:
data = {:some_data=>"foo", :some_name=>"bar", :children=>[]}
Long::Class::Name.new(data)
现在,当我深入研究数据和Long::Class::Name.new(数据)之间的代码并实例化我自己的Long::Class::Name时,如下所示:
Long::Class::Name.new(children: children, attributes: data)
它会导致成功创建,而不会出现ArgumentError
我对自己说,“好吧,我将把工厂的类调用更新为这种新格式,然后重新运行测试。”在这样做之后,我仍然会得到与上面相同的ArgumentError
我相信这是一个位置/关键字参数的问题,就像我在上面链接的那样,但是我很难看到如何纠正这个问题。除了上面的链接,我还研究了,以及。我相信我正面临最后一个环节中“无法预见的后果”部分
我还研究了有关堆栈溢出的问题,并试图了解如何使用第一个答案的第一部分来帮助我解决问题(忽略与PR相关的更新)
关于如何消除或解决这个错误,有什么想法吗?我有很多宝石我需要更新,我相信这不会是我最后一次看到这个错误。任何帮助都将不胜感激。如果需要更多信息,请告诉我。当您这样做时
data = {:some_data=>"foo", :some_name=>"bar", :children=>[]}
Long::Class::Name.new(data)
…您正在使用一个位置参数(一个包含关键字:一些\u数据,:一些\u名称,和:子项)调用该方法,而没有关键字参数
如果你这样称呼它
Long::Class::Name.new(**data)
…调用它时没有位置参数和三个关键字参数
这被称为“double splat”,它正是为您的用例而引入的,将散列转换为关键字参数。好消息,更新确实有效!:)非常感谢你!只是为了挽回面子:我很早就试过了,但我并没有放大到一组测试,所以我看不出它有效。我只是看到“46次测试失败”,觉得**添加的内容不起作用(我的业余动作,吸取的教训!)。