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行目のキー値の接頭辞 : をはずすと何事もなかったかのように動作するのです。  あくまでも既に設定済の値を上書きする前提で承知の上で実行してください。

audiobook.jp
U-NEXT
EaseUS
サウンドハウス
5G CONNECT
TikTok Shop 【リピート用プログラム】
薬屋の独り言
ネットオークションの相場、統計、価格比較といえばオークファン
それがだいじWi-Fi
【usus ウズウズ】
ベルリッツ
Amazonギフトカード
損保との違い
earthcar(アースカー)
健康サポート特集
ハイスピードプラン
アフィリエイトのアクセストレード
JETBOY
葬送のフリーレン Prime Video