更新Ruby中的哈希值

更新Ruby中的哈希值,ruby,loops,hash,Ruby,Loops,Hash,我本来打算对最初的问题发表评论,但我还没有这样做的名声 我也很想知道如何轻松地更新散列中的所有值,或者是否存在某种等效的.map!方法进行散列。有人提出了这个优雅的解决方案: hash.update(hash){|key,v1| expresion} 关于这个问题: 我的问题是,块如何知道迭代散列中的每个元素?例如,我必须调用散列中的.each来正常访问每个元素,那么为什么不是这样: hash.update(hash.each) do |key ,value| value+=1 end

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

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

hash.update(hash){|key,v1| expresion}
关于这个问题:

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

hash.update(hash.each) do |key ,value|
   value+=1
end
在带有{| key,value | expression}的块中,我正在访问每个散列元素,但我不必显式地告诉系统这一点?为什么不呢?非常感谢。

是一个更具描述性的别名

使用块调用该方法时,从文档中摘录以下内容:

如果指定了[a]块,[…]每个重复键的值为 通过使用键[…]调用块来确定

因此,上面的代码是这样工作的:

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

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

如果提供了block second参数,则该方法将执行完全相同的操作。它在提供的散列中的每个键值上循环并将其合并。唯一的区别是在发现冲突的地方,原始散列已经有一个特定键的条目。在这种情况下,将调用块来帮助解决冲突

基于这种理解,简单地将散列传递到自身将导致它在每个键值上循环,因为更新总是这样工作的。打电话,每个都是多余的


为了更清楚地了解这一点,请查看该方法的源代码,并注意在任意一个逻辑分支中对rb_hash_foreach的内部调用。

因此,在发生冲突重复键的情况下,块是更新原始哈希的规则吗?你可以说{| key,value}value+=1}?您能否为冲突创建一个规则,用原始哈希值和第二个哈希值的平均值更新原始哈希值?试图了解这种方法的范围。非常感谢您的回答。如果您查看文档,您将看到块算术实际上接受3个参数:碰撞键、原始值和新值。是的,取第二个和第三个参数的平均值会得到这样的结果:{| key,v1,v2 | v1+v2/2}expresion是对问题中已经有输入错误的原始代码的引用。