ハッシュの値に配列を使う
ハッシュの値に配列を入れたいなあと思い、
h = Hash.new([])
などと初期化してからやってみたら、h.each しても {} と表示されるだけで何も出てこない。不思議に思って key を指定してみると表示された。あるようだけれど見えないという感じ?
不思議だなあと思いつつも諦めて他の手段を使っていたところ、ふと「レシピ本」を見たらブロックで初期化するようにとのお告げ。
h = Hash.new{|h, key| h[key] = []}
などとすればよいらしいとわかって、やってみたら確かにいけた。理由はよくわからないけれど、ひとつ覚えたということでメモしておく。
いやまあ、レシピ本見ればよいのですが。
![]() | Rubyレシピブック 第3版 303の技 青木 峰郎 後藤 裕蔵 高橋 征義 まつもと ゆきひろ ソフトバンククリエイティブ 2010-08-28 by G-Tools |
最新版は 40 あまり技が増えているのか!
| 固定リンク
コメント
Hash.new(value) は存在しないキーに対するデフォルト値を指定するだけなので
1. 存在しないキーでアクセスしても新たにキーと値のペアが登録されるわけではない
2. 全ての存在しないキーに対して同じオブジェクトを返す
という挙動を示します。良く「h = Hash.new([]); h[:a] << 1; h[:b] #=> [1]?」なんて質問してる人がいますね。
投稿: | 2011.12.09 22:02
なるほど。そういうことなのですか。
ありがとうございます。
投稿: ムムリク | 2011.12.10 12:44