我正在从 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)
Run Code Online (Sandbox Code Playgroud)
这将提高 wrong number of arguments (given 1, expected 0) (ArgumentError). 之前它可以在 Ruby 2.7 中运行。我们可以做些什么来让 *args 再次工作吗?
尝试
define_method(:test) do |*args, **kwords, &block|
old_method.bind(self).call(*args, **kwords, &block)
end
Run Code Online (Sandbox Code Playgroud)
Ruby3.0正在更改方法参数的处理,这会在2.7. 存在一些意外行为,包括*args数组中的关键字。这必须使用哈希来完成,并且哈希参数和关键字之间需要有更多的区别。所以在红宝石中3.x您需要在 double splat 中捕获任意关键字集合,因为它们不能包含在 splat 参数中。
大多数情况下,我的理解是不稳定的,但我将此作为解释 ruby 发行说明中的参数更改的明确示例来阅读3.0。
| 归档时间: |
|
| 查看次数: |
770 次 |
| 最近记录: |