Webサイト制作コースのお申し込みはこちら

Rubyでは連想配列のことをハッシュと呼びますが、ハッシュ同志を連結するにはupdateメソッドを利用します。しかし、もし同じキーのハッシュがあった場合はどうなるでしょうか。Rubyのupdateメソッドを使えば、そのような場合にどうするかを指定できます。

今回はRubyにおける連想配列、ハッシュを連結する際に用いるupdateメソッドの使い方を解説します。

Rubyでハッシュを連結するには

Rubyにおけるハッシュとは添え字に文字が使える配列のことで、他のプログラム言語では連想配列と呼ばれます。そしてupdateメソッドを利用することで、ハッシュ同志を連結させたり一部を抜き出すといった操作が可能です。

とはいえハッシュとは何かを知らないとupdateメソッドを使いこなせません。そこでRubyにおけるハッシュを連結するupadteメソッドを紹介する前に、ハッシュの操作方法について紹介します。

そもそもハッシュとは

RubyにおけるハッシュとはHashクラスのオブジェクトで、Hashとは英語で「こま切れ」や「寄せ集め」といった意味の単語です。ハッシュポテトという料理がありますが、これはこま切れにしたポテトの料理のことをそう呼びます。

なおIT用語でハッシュといえば、通信データをこま切れにしたり寄せ集めしたりして、固定長の暗号化されたデータを指します。ただし、Rubyでは暗号化された文字列ではなく、連想配列の呼び名として使われます。

Rubyにおけるハッシュとは

そもそも連想配列とは、配列におけるインデックスにあたる添え字の数字を文字列にしたものです。そのため文字列をキーとして検索し、その値を取り出したり値を代入したりできます。

配列の例
arr[0], arr[1], arr[2]

ハッシュの例

hash['one'], hash['two'], hash['three']

ハッシュを連結するには

ハッシュはよく配列と比較されますが、Rubyでは全く別のオブジェクトとして扱います。そしてRubyで配列を連結するにはconcatメソッドを使うか+演算子を使いますが、ハッシュを連結するには今回紹介するupdateメソッドを使います。

配列を連結した例

[1, 2. 3]と[4, 5]を連結したら、[1, 2, 3, 4, 5]

ハッシュを連結した例

{"one" => 1, "two" => 2}と{"three" => 3}を連結したら、{"one" => 1, "two" => 2, "three" => 3}

なお配列またはハッシュを要素として追加した場合、2次元の配列になってしまうので注意してください。

updateメソッドの基本

配列を連結した場合、追加した要素にインデックスの数字が自動で割り振れます。しかしハッシュのキーはそうはいきません。ハッシュを連結するには、キーが重複した場合にどうするかを記述する必要があります。

次からupdateメソッドの文法と使い方について解説します。

updateメソッドの文法

updateメソッドは、対象となるハッシュに引数で指定したハッシュを、格納された要素の順番どおりに連結するメソッドです。なお対象となるハッシュを変更してしまうので注意してください。また、もし追加するハッシュに同じキーのメソッドがあれば、特に指定しない場合は追加したハッシュの値に書き換えます。

updateメソッドの文法

追加先のハッシュ.update(追加するハッシュ)

updateメソッドの例

h1 = {"one" => 1, "two" => 2}
h2 = {"one" => 10, "three" => 3, }
h1.update(h2)
p h1  # {"one" => 10, "two" => 2, "three" => 3}

キーが重複した場合

連結するハッシュの両方に同じキーの要素があった場合、どちらの要素を残すか決めなければなりません。先ほど紹介したように特に指定しない場合は、追加したハッシュの値に書き換えます。

もし別の方法を指定する場合は、ブロックで定義してください。また、ブロックの中には要素同志を合計した値に変えるなど、式を指定することも可能です。

なおブロックを記述する際、「||」の中にキーの文字列、追加先のハッシュの値、追加するハッシュの値の3つを指定し、それを使った条件式を記述できます。

ブロック付きのupdateメソッドの文法

追加先のハッシュ.update(追加するハッシュ) {
| キー, 追加先のハッシュの値, 追加するハッシュの値 | 重複した際に残す要素
}

ブロック付きのupdateメソッドを使った例

h1 = {"one" => 1, "two" => 2}
h2 = {"one" => 10, "three" => 3}
h1.update(h2) {
    | key, val1, val2 | val1 + val2
}
p h1  # {"one"=>11, "two"=>2, "three"=>3}

この例では、連結する2つのハッシュにキー”one”の値があり、updateメソッドに続くブロックの中で重複するキーの値の合計するように設定していることから、ハッシュh1のキー”one”が11に書き換えられます。

連結対象のハッシュが複数の場合

updateメソッドは、引数に複数のハッシュを指定できます。この場合、複数のハッシュを「,」で区切って指定してください。

複数のハッシュを指定するupdateメソッドの文法

追加先のハッシュ.update(追加するハッシュ1, 追加するハッシュ2, …)

複数のハッシュを指定する例

h1 = {"one" => 1, "two" => 2}
h2 = {"three" => 2, "four" => 4}
h3 = {"one" => 10, "five" => 5}
h4 = {"two" => 20, "six" => 6 }
h1.update(h2, h3, h4) {
    |key, val1, val2| val1 + val2
}
p h1  # {"one"=>11, "two"=>22, "three"=>2, "four"=>4, "five"=>5, "six"=>6}

updateメソッドと同じメソッド

今回紹介しているRubyのupdateメソッドと同じようにハッシュを連結するメソッドがmergeメソッドです。ただし、updateメソッドが対象となるハッシュを書き換えてしまうのに、mergeメソッドは新たなハッシュを返します。

次からmergeメソッドと同じ使い方をupdateメソッドと比較しながら説明します。

mergeメソッドの文法

mesgeメソッドはupdateと同じようにハッシュを対象とし、引数に追加するハッシュを指定します。ただしupdateメソッドが対象としたハッシュを書き換えるのに対し、mergeメソッドは対象のハッシュを変えずに連結したハッシュを返します。

mergeメソッドの文法

連結されたハッシュ = 追加先のハッシュ.merge(追加するハッシュ)

mergeメソッドの例

h1 = {"one" => 1, "two" => 2}
h2 = {"one" => 10, "three" => 3, }
out = h1.merge(h2)
p out  # {"one" => 10, "two" => 2, "three" => 3}

またmergeメソッドと同じようにブロックを利用できます。

ブロック付きのmergeメソッドの文法

連結されたハッシュ = 追加先のハッシュ.merge(追加するハッシュ) {
| キー, 追加先のハッシュの値, 追加するハッシュの値 | 重複した際に残す要素
}

merge!メソッドはupdateメソッドと同じ

Rubyには破壊的メソッドと非破壊的メソッドとがあり、破壊的メソッド名は非破壊的メソッド名に「!」が付くメソッドがたくさんあります。なお破壊的変更メソッドとは、対象となるオブジェクトを変更してしまうメソッドの呼び名です。

そしてmergeメソッドは非破壊的変更メソッドですが、このメソッド名に「!」が付いたmerge!メソッドが使えます。つまりupdateメソッドとmerge!メソッドは同じ機能です。

merge!メソッドの例

h1 = {"one" => 1, "two" => 2}
h2 = {"one" => 10, "three" => 3, }
h1.merge!(h2)
p h1  # {"one" => 10, "two" => 2, "three" => 3}

まとめ

これまで紹介したようにRubyのハッシュは、updateメソッドを利用して連結できます。もし同じキーの要素があった場合、updateメソッドに続くブロックにどちらの値を選ぶか指定したり、値の合計を計算して書き換えることも可能です。

また、updateメソッドは破壊的メソッドですが、同じ機能のmerge!メソッドも使えます。さらに非破壊メソッドのmergeメソッドも利用可能です。目的に応じて使い分けてください。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。