我对预期的RuntimeError有一个很大的问题:“在迭代期间无法将新密钥添加到哈希中”
在我的情况下,我有一个YAML文件:test.yaml - 我已经添加了一些键。
test.yaml
key1:
key2:
key3:
我在变量中获取文件的内容:
file_hash = YAML.load_file("testm.yaml")
然后我需要循环遍历此哈希并向其添加其他键:
file_hash.each do |key|
file_hash[key] = 'key_1'
file_hash[key] = 'key_2'
end
File.open('test.yaml', 'w') { |f| YAML.dump(file_hash, f) }
主要问题是我在循环中无法写入散列。当你有权控制循环块时,我不明白为什么会这样。 还有另一种方法可以完成我上面展示的内容吗?
注意:我使用的是RUBY 1.9.3 p547
答案 0 :(得分:14)
Ruby自1.9开始使用 lazy 迭代,因此它们禁止向迭代的 hash 添加新密钥。作为一种解决方案,您可以在执行each
之前轻松复制 hash 或将其转换为 array 。
irb(main):001:0> a={1=>1}; a.each {|k,v| a[2] = 2}
RuntimeError: can't add a new key into hash during iteration
irb(main):002:0> a={1=>1}; a.clone.each {|k,v| a[2] = 2}; a
=> {1=>1, 2=>2}
irb(main):003:0> a={1=>1}; a.to_a.each {|k,v| a[2] = 2}; a
=> {1=>1, 2=>2}
答案 1 :(得分:9)
您正在修改您正在迭代的哈希值。你不能这样做。
而是尝试另一种方法:
keys = [1,2,3,4]
file_hash = YAML.load_file("testm.yaml")
keys.each{ |key| file_hash[key] = 'key1' }
# => {1 => 'key1', 2 => 'key1', 3 => 'key1', 4 => 'key1'}
答案 2 :(得分:2)
我在
处遇到了相同的错误<%= stylesheet_link_tag 'application', 'data-turbolinks-track' => 'reload', media: 'all' %>
所以我用以下代码重写代码:
<% begin %>
<%= stylesheet_link_tag 'application', 'data-turbolinks-track' => 'reload', media: 'all' %>
<%= javascript_include_tag 'application', 'data-turbolinks-track' => 'reload' %>
<% rescue %>
<script>
window.location.replace "#{user_session_url()}"
</script>
<% end %>
我不知道是什么导致了此问题,但是此替代方法对我有用。我用
进行了测试ab -n 100 -c 10 -w http://localhost:3000/es
我没有收到任何错误消息
答案 3 :(得分:0)
之前的回答并没有帮助我,所以我建议帮助我
a={1=>1}; a = a.clone; a[2] = 2; a