0

我正在从 Ruby 2.7 升级到 3.0,但遇到了关键字参数更改的问题。

以前我们出于某些目的在代码中使用了 define_method。但是,随着关键字参数的更改,它不再能够正确处理参数数组。

class Foo
  def test(a: 1, b: 2)
    puts a
    puts b
  end

  old_method = instance_method(:test)

  define_method(:test) do |*args, &block|
    old_method.bind(self).call(*args, &block)
  end
end

Foo.new.test(a: 1)

这将提高 wrong number of arguments (given 1, expected 0) (ArgumentError). 它以前在 Ruby 2.7 中工作。我们可以做些什么来让 *args 再次工作吗?

4

1 回答 1

3

尝试

  define_method(:test) do |*args, **kwords, &block|
    old_method.bind(self).call(*args, **kwords, &block)
  end

Ruby3.0正在改变对在2.7. 存在一些意外行为,包括*args数组中的关键字。这必须使用散列来完成,并且散列参数和关键字之间需要有更多的区别。因此,在 ruby​​ 中3.x,您需要在双 splat 中捕获任意关键字集合,因为它们不能包含在 splat 参数中。

大多数情况下,我的理解是不稳定的,但我将其作为一个明确的示例阅读,以解释 ruby​​ 发行说明中对参数的更改3.0

于 2021-04-28T19:08:45.080 回答