0

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

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

正如预期的那样,有一个循环引用......但请稍等!key1并且key2被正确定义!

好的,所以它们是之前定义的,这意味着我可以完全摆脱散列,对吗?

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

现在它起作用了。但是为什么需要这些默认值呢?

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

4

1 回答 1

2

现在它起作用了。但是为什么需要这些默认值呢?

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

something { |key1:, key2:| puts "key1:#{key1}, key2:#{key2}" }
# key1:1, key2:2
于 2020-04-14T10:57:29.630 回答