0Day Forums
Is there a solution to bypass 'can't add a new key into hash during iteration (RuntimeError)'? - Printable Version

+- 0Day Forums (https://zeroday.vip)
+-- Forum: Coding (https://zeroday.vip/Forum-Coding)
+--- Forum: Ruby (https://zeroday.vip/Forum-Ruby)
+--- Thread: Is there a solution to bypass 'can't add a new key into hash during iteration (RuntimeError)'? (/Thread-Is-there-a-solution-to-bypass-39-can-39-t-add-a-new-key-into-hash-during-iteration-RuntimeError-39)



Is there a solution to bypass 'can't add a new key into hash during iteration (RuntimeError)'? - shariamt - 07-19-2023

I have a big problem with the expected RuntimeError: "can't add a new key into hash during iteration"

In my case a I have a YAML file: test.yaml - in which I have some keys already added.

test.yaml
key1:
key2:
key3:

I am getting the contents of the file in a variable:

file_hash = YAML.load_file("testm.yaml")

Then I need to loop through this hash and add other keys to them:

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

The main issue is that I am unable to write into a hash while in a loop. I don't understand why this is expected, when you have the power to control the loop block.
Is there another way in which I can accomplish what I showed above?

Note: I am using RUBY 1.9.3 p547



RE: Is there a solution to bypass 'can't add a new key into hash during iteration (RuntimeError)'? - cardinal460548 - 07-19-2023

I had the same error at

<%= stylesheet_link_tag 'application', 'data-turbolinks-track' => 'reload', media: 'all' %>

So I rewrite my code with:

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

I do not know what is causing this issue, but this workaround works for me. I tested it with

ab -n 100 -c 10 -w

[To see links please register here]


And I did not got any error messages


RE: Is there a solution to bypass 'can't add a new key into hash during iteration (RuntimeError)'? - durno131 - 07-19-2023

previous answer didn't help me, so i propouse that help for me

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


RE: Is there a solution to bypass 'can't add a new key into hash during iteration (RuntimeError)'? - bastinado527 - 07-19-2023

Ruby since 1.9 is using *lazy* iteration, thus they forbid to add new keys to the *hash* you iterating over. As a solution you can easily duplicate *hash* or convert it to *array* before doing `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}




RE: Is there a solution to bypass 'can't add a new key into hash during iteration (RuntimeError)'? - spigum - 07-19-2023

You're modifying the hash you're iterating over. You can't do it.

Instead try another approach:

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