Ruby - トラブルシュート - can\

 クラウディア
1. 概要
2. 理由
3. 裏技?

1. 概要


#!/usr/bin/env ruby

hash1 = { :foo => 'bar', :hoge => 'fuga' }
hash2 = {}

hash1.each do | key, value |
  hash1[:key] = 'っぶぶ'
  hash2[:key] = value
end
 上記のソースを実行すると、下記のエラーとなります。

> ./ソースファイル名.rb
../hash.rb:7:in `block in <main>': can't add a new key into hash during iteration (RuntimeError)
        from ../hash.rb:6:in `each'
        from ../hash.rb:6:in `<main>'

2. 理由

 理由は至極あたりまえの話で、ハッシュのキーでループしているときにその値を書き換えるなということですね。  それはその通りでそういうコーディングをしちゃいかんのです。

3. 裏技?

 果たしてこれが裏技なのかどうか?  すくなくとも ruby 2.4.4p296 では

#!/usr/bin/env ruby

hash1 = { :foo => 'bar', :hoge => 'fuga' }
hash2 = {}

hash1.each do | key, value |
  hash1[key] = 'っぶぶ'
  hash2[:key] = value
end
 てな感じで 7行目のキー値の接頭辞 : をはずすと何事もなかったかのように動作するのです。  あくまでも既に設定済の値を上書きする前提で承知の上で実行してください。