通过并行分配迭代哈希列表

Iterating over list of hashes via parallel assignment

我刚刚看到这段代码(简化版):

def something
  yield(key1: 1, key2: 2)
end

something { |key1: key1, key2: key2|  puts "key1:#{key1}, key2:#{key2}" }
# (irb):351: warning: circular argument reference - key1
# (irb):351: warning: circular argument reference - key2
# key1:1, key2:2

正如预期的那样,存在循环引用...但请稍等! key1key2 定义正确!

好的,所以它们是之前定义的,也就是说,我可以完全去掉散列,对吗?

something { |key1, key2|  puts "key1:#{key1}, key2:#{key2}" }
# key1:{:key1=>1, :key2=>2}, key2:

不,循环引用很棒!但是...并行赋值不起作用,第一个变量得到整个哈希值。

所以我试着稍微清理一下:

something { |key1: nil, key2: nil|  puts "key1:#{key1}, key2:#{key2}" }
# key1:1, key2:2

现在可以了。但是为什么需要这些默认值呢?

这里究竟发生了什么? 有没有更好的方法来迭代扩展它们的哈希列表? 也将不胜感激指向文档的指针。

Now it works. But why are those default values needed at all?

它们不是,您可以省略默认值:

something { |key1:, key2:| puts "key1:#{key1}, key2:#{key2}" }
# key1:1, key2:2