17

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

4

4 回答 4

20

Ruby 从 1.9 开始使用惰性迭代,因此它们禁止向您迭代的哈希添加新键。作为一种解决方案,您可以在执行之前轻松复制哈希或将其转换为数组each

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}
于 2014-12-25T03:04:46.917 回答
10

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

而是尝试另一种方法:

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'}
于 2014-08-08T08:42:01.773 回答
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

而且我没有收到任何错误消息

于 2018-09-18T13:33:45.473 回答
0

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

a={1=>1}; a = a.clone; a[2] = 2; a
于 2017-02-16T14:08:57.073 回答