从Ruby 2.7升级到3.0时出现ArgumentError-与位置参数和关键字参数的分离有关?

从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

我正在尝试将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: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次测试失败”,觉得**添加的内容不起作用(我的业余动作,吸取的教训!)。