ruby - 获取 "can' t 在迭代期间将新 key 添加到哈希中”

标签 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

有什么更简单的方法可以做到这一点?请注意,我想对此数据结构进行更改,而不是创建新的数据结构。

最佳答案

What is an easier way to do this?

永远不要修改您正在迭代的集合。 (除非您确切知道为什么必须这样做)。相反,克隆/复制集合。您现在拥有同一事物的两个副本。迭代一个,但修改另一个

完成后,用修改后的副本替换原始副本(可选,根据要求)。

在这种情况下,没有必要在迭代之前克隆哈希,然后从中删除键。您可以构建一个新的哈希,所有键都已“调整”(无论这意味着什么)。

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

关于ruby - 获取 "can' t 在迭代期间将新 key 添加到哈希中”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47224116/

相关文章:

python - 按键对字典进行排序,其中键是字符串和数字的混合,然后使用排序的 key_values 创建一个新字典

c# - 是否有支持分层模板的 PHP/Javascript/c#/java 或 ruby​​ 模板引擎?

ruby-on-rails - 如何确保 Sphinx 守护进程运行?

javascript - Turbolinks 似乎加载了我的页面两次

java - Java中HashMap的解析

python - 为什么给字典的键 `True` 赋值会覆盖同一字典中键 `1` 的值?

c# - 如何使用动态(数字)键名反序列化子对象?

ruby - 为什么这个 Ruby Case block 的计算结果不为 True?

javascript - rails 部分渲染 html 不运行 javascript

具有相同键类型和不同项目类型的c++映射