Rubyを学習しようとしている方や学習を始めたての方にとってはHash(ハッシュ)と聞いてもピンとこないかもしれません。今回はそんな方に向けて「Hashとはなにか?」「Hashを使ってできること」について紹介していきます。

Hash(ハッシュ)をしっかり覚えてRubyのマスターに近づきましょう!

RubyのHash(ハッシュ)とは?

RubyのHashとはキーと値を使ってデータを管理できるオブジェクトです。連想配列とも呼ばれます。PHPを学習したことがある方なら連想配列は聞きなじみがあるのではないでしょうか?つまり値だけではなく、キーと値を組み合わせて要素(データ)を管理する配列なのです。

配列はインデックス番号で値を管理していますが、Hashはキーという任意の名前をつけて要素を管理できます。

Hash(ハッシュ)の書きかた

さっそくHash(ハッシュ)の書きかたについて紹介します。Hashは以下のように記述します。

連想配列名 = {キー1 => 値1, キー2 => 値2, キー3 => 値3, キー4 => 値4}

# 例
goods = {"鉛筆" => "100円", "消しゴム" => "90円", "定規" => "80円", "筆箱" => "1000円",}

Hashは上記のように{}の中にキー => 値という形で記述していきます。各要素は,で区切ることに注意してください。上記の例ではgoodsというHashを作成しました。要素についてみると"鉛筆" => "100円"のような記述が1つの要素となっています。「”鉛筆”」がキーで「”100円”」が値になります。

それでは要素の値を出力したい時はどうすればいいでしょうか?putsを使って出力してみましょう!

goods = {"鉛筆" => "100円", "消しゴム" => "90円", "定規" => "80円", "筆箱" => "1000円",}

puts goods["定規"] #出力結果 80円

Hashの要素を扱いたい時は連想配列名[キー]で値を呼び出すことができます。「”定規”」の値を取得したい時はgoods["定規"]と記述します。。

RubyのHash(ハッシュ)で何ができる?

作成したHashに対しては要素の追加や削除、すでにある要素の値の更新ができます。Hashを使っていると要素を後から追加したり削除した場面があります。その度にHashを最初から作り直していては手間ですし面倒です。RubyのHashではすでに作成したHashに要素の追加や削除ができます。Hashを扱う時にはよく使うので解説していきます。

Hash(ハッシュ)に要素を追加する

早速Hashに要素を追加してみましょう!先程定義したHashのgoodsに新しく120円のシャープペンを追加したい場合はを考えてみます。

# Hashに要素を追加する文法
連想配列名[追加するキー] = 追加したい値

# 例
goods = {"鉛筆" => "100円", "消しゴム" => "90円", "定規" => "80円", "筆箱" => "1000円",}
puts goods
# 出力結果
# {"鉛筆" => "100円", "消しゴム" => "90円", "定規" => "80円", "筆箱" => "1000円",}

goods["シャープペン"] = "120円"
puts goods
# 出力結果
# {"鉛筆" => "100円", "消しゴム" => "90円", "定規" => "80円", "筆箱" => "1000円", "シャープペン" => "120円"}

Hashに要素を追加したい時は連想配列名 = [追加するキー] = 追加したい値と記述します。

上記コードの出力結果を見るとHashの要素の末尾に"シャープペン" => "120円"が追加されているのがわかると思います。

Hash(ハッシュ)の要素の値を変更する

Hashの要素の値を後から変更することもできます。今回は作成したgoods(Hash)の要素である鉛筆の値を70円に変更してみます。

# Hashの要素の値を変更する文法
連想配列名[値を変更したいキー] = 変更後の値

# 例
goods = {"鉛筆" => "100円", "消しゴム" => "90円", "定規" => "80円", "筆箱" => "1000円",}
puts goods
# 出力結果
# {"鉛筆" => "100円", "消しゴム" => "90円", "定規" => "80円", "筆箱" => "1000円",}

goods["鉛筆"] = "70円"
puts goods
# 出力結果
# {"鉛筆" => "70円", "消しゴム" => "90円", "定規" => "80円", "筆箱" => "1000円",}

Hashの要素の値を変更したい時は連想配列名[値を変更したいキー] = 変更後の値と記述します。変更後の値の出力結果を見ると鉛筆が70円に変わっていますね。

Hash(ハッシュ)の要素を削除する

今度はHashの要素を削除してみましょう!作成したHashgoodsから"鉛筆" => "100円"の要素を削除します。

# Hashの要素を削除する文法
連想配列名.delete(削除したいキー)

# 例
goods = {"鉛筆" => "100円", "消しゴム" => "90円", "定規" => "80円", "筆箱" => "1000円",}
puts goods
goods.delete("鉛筆")

puts goods
# 出力結果
# {"消しゴム" => "90円", "定規" => "80円", "筆箱" => "1000円",}

要素を削除したい時は連想配列名.delete(削除したいキー)と記述します。コードを見ていただくと"鉛筆" => "100円"が削除されていることが分かると思います。

RubyのHash(ハッシュ)に対して処理を実行しよう!

eahcメソッドでHashの繰り替えし処理をしよう

eachメソッドを使うことでHashの要素を順に取り出す繰り返し処理ができます。格納されている要素の順番で繰り返し処理が実行されます。goodsの要素を順に取り出し「【キー】は【値】です」の形式で出力してみます。

# 繰り返し処理の文法
連想配列名.each do |key, value|
  処理の内容
end

# 例
goods = {"鉛筆" => "100円", "消しゴム" => "90円", "定規" => "80円", "筆箱" => "1000円",}
goods.each do |key, value|
  puts "#{key}は#{value}です"
end
# 出力結果
# 鉛筆は100円です
# 消しゴムは90円です
# 定規は80円です
# 筆箱は1000円です

繰り返し処理をするには連想配列名.each do |key, value|endの間に実行したい処理を記述します。ブロックの引数がkey(キー)とvalue(値)で2つになっている点に注意してください。

sizeメソッドでHashの要素の数を調べる

sizeメソッドを使うことでHashの要素の数を調べることができます。goodsの要素の数を調べてみます。

# 要素の数を調べる文法
連想配列名.size

# 例
goods = {"鉛筆" => "100円", "消しゴム" => "90円", "定規" => "80円", "筆箱" => "1000円",}
goods.size #結果:4

連想配列名.sizeと記述するだけで簡単に要素の数が取得できます。goods の要素は4つなので数値の4が返ってきました。

empty?メソッドでHashが空かどうかを調べる

empty?メソッドでHashに要素があるかないかを調べることができます。以下ではあえて空のHashを作成しempty?メソッドでHashが空であるかどうかを調べています。

# Hashが空かどうかを調べる
連想配列名.empty?

# 例
hash = {}
hash.empty? #結果:true

Hashが空であるためtrueが返ってきました。ご覧の通りempty?メソッドは空であればtrueそうでなければfalseを返してくれます。

Hashのキーを配列として取得する

RubyのHashでは要素のキーのみを配列として取得することができます。

# キーを配列として取得する文法
連粗配列名.keys

# 例
goods = {"鉛筆" => "100円", "消しゴム" => "90円", "定規" => "80円", "筆箱" => "1000円",}
goods.keys
#結果:["鉛筆, "消しゴム", "定規", "筆箱"]

記述方法はHash.keysです。Hashの要素のキーのみを取り出して配列にして返してくれます。

Hashの値を配列として取得する

RubyのHashでは要素の値のみを配列として取得することができます。

# 値を配列として取得する文法
連想配列名.values

# 例
goods = {"鉛筆" => "100円", "消しゴム" => "90円", "定規" => "80円", "筆箱" => "1000円",}
goods.values
#結果:["100円", "90円", "80円", "1000円"]

Hash.valuesと記述することでHashの値のみを要素とした配列を返します。

to_aメソッドでHashのキーと値のペアを配列として取得する

to_aメソッドを使えば、Hash内の要素であるキーと値のペアを1つの配列として、その配列を要素とするHasnを作成することができます。文面だけでは分かりづらいと思うので下記にto_aメソッドを使ったコードを掲載しました。

# キーと値のペアを配列として取得する文法
連想配列名.to_a

# 例
goods = {"鉛筆" => "100円", "消しゴム" => "90円", "定規" => "80円", "筆箱" => "1000円"}
goods.to_a
#結果:[["鉛筆", "100円"], ["消しゴム", "90円"], ["定規", "80円"], ["筆箱", "1000円"]]

記述方法はHash.to_aです。to_aメソッドを使うことで[[キー1, 値1], [キー2, 値2], [キー3, 値3].....]となるキーと値がペアになった配列を要素とする配列を作ることができます。

Hash同士を結合する

RubyのHashでは異なるHash同士を結合して1つのHashとすることができます。mergeメソッドmerge!メソッドを使って結合することができます。メソッド名に!がついているかどうかの違いですが挙動はそれぞれ違うのでしっかりと覚えておきましょう!

mergeメソッドで結合する

mergeメソッドでは異なる配列を結合しますが、元となったHashには変更が加えられません。下記にコードを掲載しましたのでご覧ください。

# 元のHashが変更変更されない結合
連想配列名.merge

# 例
goods = {"鉛筆" => "100円", "消しゴム" => "90円"}
ohers = {"定規" => "80円", "筆箱" => "1000円"}
goods.merge(others)
#結果:{"鉛筆" => "100円", "消しゴム" => "90円", "定規" => "80円", "筆箱" => "1000円"}

#元のHashであるgoodsは変更されない
goods
#結果:{"鉛筆" => "100円", "消しゴム" => "90円"}

上記のようにmergeメソッドを使うことでgoodsohersが1つのHashに結合されたことが分かると思います。goodsに関してはmergeメソッドを実行した後でもgoodsには何も変化がないことにも注目してください。mergeメソッドのように元のオブジェクトに変更を加えないメソッドを非破壊的メソッドと呼びます。

merge!メソッドで結合する

merge!メソッドも同様にHash同士を結合するメソッドですが、元になったHashにも変更を加えます。先程のコードをmerge!メソッドを使って挙動の違いを見てみましょう!

# 元のHashが変更される結合
連想配列名.merge!

# 例
goods = {"鉛筆" => "100円", "消しゴム" => "90円"}
others = {"定規" => "80円", "筆箱" => "1000円"}
goods.merge!(others)
#結果:{"鉛筆" => "100円", "消しゴム" => "90円", "定規" => "80円", "筆箱" => "1000円"}

#元のHashであるgoodsも変更される
goods
#結果:{"鉛筆" => "100円", "消しゴム" => "90円", "定規" => "80円", "筆箱" => "1000円"}

merge!メソッド実行後のgoodsを見ると要素がメソッド実行前と変わっていますね。merge!メソッドは元のHashであるgoodsそのものに変更を加えます。元のオブジェクトを変更してしまうメソッドを破壊的メソッドと呼びます。

破壊的・非破壊的とは?
破壊的メソッドとはオブジェクト自身を変更するメソッドのことです。反対に非破壊的メソッドはオブジェクトを変更することはありません。Rubyにはmerge(merge!)メソッドのように処理は同じでも破壊的メソッドと非破壊的メソッドを持つメソッドが複数あります。他にも英小文字を大文字にするupcase(upcase!)メソッドなどがあります。気になる方は検索してみてください。

RubyのHashはしっかりマスターしよう!

RubyのHashについて作成、要素の追加や削除、Hashで使えるメソッドの一例を紹介してきました。

Hashは配列とは違いキーと値で関連付けたい時にとても便利です。Rubyでコードを書く時はとてもよく使うのでマスターして使いこなせるようになりましょう!