在Ruby 2.7中,我可以有效地解构块参数中的散列:
>> RUBY_VERSION
=> "2.7.6"
>> [{foo: 123}].each { |foo:| p foo }
123
=> [{:foo=>123}]
在Ruby 3.1中,我不能:
>> RUBY_VERSION
=> "3.1.2"
>> [{foo: 123}].each { |foo:| p foo }
(irb):7:in `block in <top (required)>': missing keyword: :foo (ArgumentError)
- 有 * 可能在参数列表 * 之外 * 对其进行模式匹配:
[{foo: 123}].each { |x| x => {foo:}; p foo }
但如果可能的话,我会在参数列表 * 中寻找一些东西。
3条答案
按热度按时间am46iovg1#
简短回答:没有
each
只传递{foo: 123}
散列作为块参数,但是Ruby 3期望传递一个实际的foo:
关键字,它等价于:您必须传递关键字参数或通过
**
转换散列:无论哪种方式,这都必须在调用方一侧"固定"。
在你的代码中,调用者是
each
。为了让你的代码正常工作,你 * 可以 * 定义你自己的each
变量来完成所需的转换:对于示例数据,其工作方式与预期相同:
不过,我还是坚持使用
each
,并从传递的散列中获取值:如果你有一个散列,你可能应该把is当作一个散列。
nhaq1z212#
关键字参数处理的差异:
我能找到的最接近的:
f4t66c6m3#
在ruby 3中,我们可以使用向右赋值来解构:
注意:
foo
将在每次迭代时分配新值