Есть ли решение обходить "не может добавить новый ключ в хэш во время итерации (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
Ответы
Ответ 1
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}
Ответ 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'}
Ответ 3
предыдущий ответ мне не помог, поэтому я предлагаю эту помощь для меня
a={1=>1}; a = a.clone; a[2] = 2; a
Ответ 4
У меня была такая же ошибка при
<%= 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
И у меня не было сообщений об ошибках