やりたいこと
繰り返し文を使っているとき、配列の[]<< hoge
みたいに値を入れていくように、 {} << hoge
的な感じでハッシュの塊を結合してみたいと思った。
しかし、そんな文法はないのでもちろんエラーが発生するので色々試して見た。
mergeメソッドでハッシュを結合する
mergeを使ってハッシュを結合してみる。
hash = {}
hoge = {color: "red"}
=> {color: "red"}
hash
=> {}
しかし、これではhashがセーブされないのでhashを返す時には空になっているだけである。
**でハッシュを展開
**を使うというパターンもある。
hash = {}
{color: "red", **hash}
=> {color: "red"}
hash
=> {}
しかし、これもhashの値が更新されるわけでもない。
merge!メソッドでハッシュを更新##
ここで使ったのがmerge!メソッド。
これでhashの値を保持することができる。(updateのエイリアス)
hash = {}
hoge = {color: "red"}
hash.merge!(hoge)
=> {color: "red"}
hash
=> {color: "red"}
しかし、注意して欲しいのが、updateメソッドと同様、すでに存在するキーを追加していくと、ただ単にハッシュが更新されてしまうだけであること。
hash = {}
hoge = {color: "red"}
fuga = {color: "blue"}
hash.merge!(hoge)
=> {color: "red"}
hash.merge!(fuga)
=> {color: "blue"}
hash
=> {color: "blue"} #colorの値を更新しただけ
同じキーが複数存在するのはありえないので当たり前といえば当たり前ですが。。
なので、それぞれ違うキーを追加していくときに使うことができます。
繰り返し文でハッシュを結合してみる
例えば、ユーザーの名前、点数をセットにしてhashに追加していく処理があったとすると、以下のようになります。
hash = {}
Users.each do |user|
hash.merge!(user.name => user.score)
end
puts hash
{"taro" => 70, "hanako" => 80, "jiro" => 100", "reon" => 20 }
これでそれぞれのユーザーどの点数だったのかをまとめたハッシュを返すことができます。