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