14
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Rails】繰り返し文でハッシュの結合(追加)をする方法

Last updated at Posted at 2018-07-03

やりたいこと

繰り返し文を使っているとき、配列の[]<< 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 }

これでそれぞれのユーザーどの点数だったのかをまとめたハッシュを返すことができます。

14
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?