我有一个哈希,其键是一个数字,其值是一个数组。给定boundary
的数字,我想调整哈希值中大于boundary
的所有键。
我试过了:
header_info_hash.each do |k, v|
if boundary < k
val = header_info_hash[k]
header_info_hash.delete(k)
header_info_hash[k-1] = val
end
end
但它引发了一个错误:
RuntimeError: can't add a new key into hash during iteration
更简单的方法是什么?请注意,我想对此数据结构进行更改,而不是更新新数据结构。
答案 0 :(得分:3)
更简单的方法是什么?
永远不要修改您正在迭代的集合。 (除非你确切知道为什么必须这样做)。相反,克隆/复制集合。你现在有两份相同的东西。迭代一个,但修改其他。
完成后,将原件替换为修改过的副本(可选,视要求而定)。
在这种情况下,没有必要在迭代之前克隆哈希,然后从中删除键。你可以建立一个新的哈希,所有的密钥已经被调整了#34; (无论那意味着什么)。
new_header_info_hash = header_info_hash.each_with_object({}) do |(k, v), result|
if boundary < k
result[k-1] = v
else
result[k] = v
end
end