Ruby3中的哈希解构

我 Ruby 2 您可以执行以下操作:

my_hash = {a: {aa: 1, ab: 2, ac: 3}}

my_hash.each do |key, aa:, ab: 4, **|
  puts key
  puts aa
  puts ab
end

在 Ruby 3 中,这现在导致missing keywords :aa, :ab. 在 Ruby 3 中重构这样的代码的最佳方法是什么?

像下面这样的东西不起作用,因为它不支持设置默认值:

my_hash.each do |key, values|
  values in {aa: aa, ab: ab}
end

我能想到的最好方法是将现有代码放在包装器中:

lambda = ->(key, aa:, ab: 4, **) do
  puts key
  puts aa
  puts ab
end

my_hash.each do |key, values|
  lambda.call(key, **values)
end

还有更好的选择吗?

回答

我想不出将哈希转换为关键字参数的方法。

但是为什么不按原样使用散列,即不将其键视为关键字?除非您的实际代码更复杂,否则fetch似乎可以执行您想要的操作:

my_hash = {a: {aa: 1, ab: 2, ac: 3}}

my_hash.each do |key, values|
  puts key
  puts values.fetch(:aa)
  puts values.fetch(:ab, 4)
end

以上在 Ruby 2 和 3 中都可以正常工作。就像您的示例一样,如果:aa缺少,它将引发错误,并且将使用默认值4if :abis missing。


以上是Ruby3中的哈希解构的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>