simanのブログ

ゆるふわプログラマー。競技プログラミングやってます。Ruby好き

Rubyでハッシュのデフォルト値を配列にする

RubyではHashのデフォルト値をHash.newの引数として渡すことで実現できますが、配列を渡すと同じ参照になってしまうのでうまくいきません。

list = Hash.new([])

list[:even] << 2 

p list[:even] #=> [2]

list[:odd] << 3

p list[:odd]  #=> [2,3]
[2]
[2, 3]


ですので、配列の場合は少し違う書き方をしないといけません。

list = Hash.new{|hash, key| hash[key] = []}

list[:even] << 2 

p list[:even] #=> [2]

list[:odd] << 3

p list[:odd]  #=> [3]
[2]
[3]

Hash.newにブロックを与えるとブロック引数の1番目がhash自身、2番目がkeyとなります。そこで上記のように配列を定義してあげると、keyごとに配列を初期化することが出来るようになります。


参考サイト

「Hashクラス」
http://doc.ruby-lang.org/ja/1.9.3/class/Hash.html