有没有解决方案绕过’迭代过程中无法将新密钥添加到哈希(RuntimeError)’?

我对预期的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

Ruby从1.9开始使用延迟迭代,因此它们禁止向迭代的哈希添加新键。 作为一种解决方案,您可以轻松地复制哈希或将其转换为数组,然后再执

 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} 

你正在修改你正在迭代的哈希。 你不能这样做。

而是尝试另一种方法:

 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'} 

以前的回答没有帮助我,所以我建议帮助我

 a={1=>1}; a = a.clone; a[2] = 2; a 

我有同样的错误

 <%= 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 %>  <% end %> 

我不知道是什么导致了这个问题,但这个解决方法对我有用。 我测试了它

 ab -n 100 -c 10 -w http://localhost:3000/es 

我没有收到任何错误消息