获取"在迭代期间无法将新密钥添加到哈希中#34;

时间:2017-11-10 13:40:21

标签: ruby key

我有一个哈希,其键是一个数字,其值是一个数组。给定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

更简单的方法是什么?请注意,我想对此数据结构进行更改,而不是更新新数据结构。

1 个答案:

答案 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