Ruby 获得;can';t在迭代过程中将新密钥添加到哈希中;

Ruby 获得;can';t在迭代过程中将新密钥添加到哈希中;,ruby,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 做这件事的简单方法是什么?请注意,我想对这个数据结构

我有一个散列,它的键是一个数字,值是一个数组。给定一个数字
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
做这件事的简单方法是什么?请注意,我想对这个数据结构进行更改,而不是创建一个新的数据结构

做这件事的简单方法是什么

永远不要修改正在迭代的集合。(除非你确切知道为什么你必须这么做)。而是克隆/复制集合。你现在有两份同样的东西。迭代一个,但修改另一个

完成后,用修改后的副本替换原件(可选,视需要而定)

在这种情况下,无需在迭代之前克隆哈希,然后从中删除密钥。您只需构建一个新的散列,所有键都已“调整”(不管这意味着什么)

new_header_info_hash=header_info_hash。每个带有_对象({})的_都做|(k,v),结果|
如果边界
根本不清楚“调整所有键”是什么意思。我没听清楚。我真想知道你为什么把它拿走了。sawa:同样的标签描述建议我们使用
[ruby hash]
,但我从来没有看到过它会带来任何价值的问题。为什么你会遵循OP的大错误调用
header\u info\u hash[k]
,而这可以简单地称为编写
v
,我只是应用了一些形式化的转换,没有对代码进行太多的解读。:)谢谢。我想即使密钥不满足条件,您也需要将值赋给新的哈希。@sawa:是的。如果你再找到一个,我会删除这个草率的答案(或者只是代码):@Natalia:No,
header\u info\u hash=new\u header\u info\u hash
不会对原始数据结构进行任何更改。它只会对变量进行更改。
RuntimeError: can't add a new key into hash during iteration
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