更新Ruby中的哈希值更新

时间:2014-08-27 20:32:30

标签: ruby loops hash

我打算对最初的问题发表评论,但我还没有这样做的声誉....

我也想知道如何轻松更新哈希中的所有值,或者是否存在某种等效的.map!哈希的方法。有人提出了这个优雅的解决方案:

hash.update(hash){|key,v1| expresion}

关于这个问题:     Ruby: What is the easiest method to update Hash values?

我的问题是块如何知道迭代哈希中的每个元素?例如,我必须在散列上调用.each来正常访问每个元素,所以为什么不是这样的:

hash.update(hash.each) do |key ,value|
   value+=1
end

在带有{|键,值|的块中我正在访问每个哈希元素但是我没有明确告诉系统这个?为什么不?非常感谢你。

2 个答案:

答案 0 :(得分:0)

Hash#updateHash#merge!的别名,更具描述性。

使用块调用方法时,会发生以下情况(摘自文档):

  

如果指定了[a]块,则[...]每个重复键的值为   通过使用键[...]

调用块来确定

所以,上面的代码就像这样:

散列与自身合并,并且对于每个重复键,调用该块。当我们将哈希与自身合并时,每个新添加的密钥都是重复的,因此调用该块。结果是哈希中的每个值都被expresion替换。

答案 1 :(得分:0)

Hash#update将哈希作为第一个参数,将可选块作为第二个参数。如果省略第二个参数,该方法将在内部循环提供的散列中的每个键值对,并使用它们合并到原始散列中。

如果提供了块(第二个参数),则该方法完全相同。它遍历提供的哈希中的每个键值并将其合并。唯一的区别是发现冲突的位置(原始哈希已经有特定键的条目)。在这种情况下,调用该块以帮助解决冲突。

基于这种理解,简单地将哈希传递给自身将导致它遍历每个键值,因为这就是update始终有效的方式。调用.each将是多余的。

要更清楚地看到这一点,请查看#update方法的源代码,并注意逻辑分支中对rb_hash_foreach的内部调用。