RubyのHashとは?Hashの概要と基本操作を解説
Rubyを学習する際に登場するHash(ハッシュ)という概念。今回はこのHashについて、概要や使い方、配列との違いなどを実際のコードとあわせて解説していきます。HashはRubyでプログラミングをする際には必須といっていいほど様々な場面で使用されます。
この記事を読んでHashについての知識をぜひ身につけてください。
RubyのHashについて
まずはHash(ハッシュ)とはどのような概念なのかということを説明していきます。
Hashは連想配列とも呼ばれ、その名のとおり配列に似た概念です。
配列との違い
Hashも配列と同じように複数の要素を格納するために使用します。
配列との違いですが、配列が要素を指定するのに「0」から始まるインデックスを使用するのに対し、Hashはインデックスに「キー」と呼ばれる任意の文字列を指定して「バリュー」と呼ばれる要素を指定します。
RubyのHashの基本
まずはHashの基本的な使い方を見ながら「キー」や「バリュー」を理解していきましょう。
Hashの作成
Hashは以下のように作成します。
連想配列名 = {キー名1 => バリュー1, キー名2 => バリュー2, キー名3 => バリュー3}
どういうことなのか、例を使ってみてみましょう。
Hashを作成し、要素を取得してみます。
menu = {"うどん" => "300円", "ラーメン" => "500円", "パスタ" => "800円"}
print menu["うどん"]
出力結果:
300円
このように、Hashではインデックスが番号ではなく指定したキーとなっています。要素を取得する際も、キーを指定することでセットになっている値(バリュー)を取得します。
Hashは今回の例のようにキーとバリューを関連付けたいときに非常に有用です。
要素の取得
Hashからの要素の取得方法はいくつかありますが、一番スタンダードな方法が、
Hash名[取得したい要素のキー]
で取り出す方法です。
以下のコードでは、「menu」というHashから「うどん」というキーの要素を取得しています。
menu = {"うどん" => "300円", "ラーメン" => "500円", "パスタ" => "800円"}
print menu["うどん"]
出力結果:
300円
要素の追加
次はHashに要素を新たに追加する方法です。
Hash名[新しいキー] = 新しいバリュー
という形式で要素を追加できます。
menu = {"うどん" => "300円", "ラーメン" => "500円", "パスタ" => "800円"}
p menu
menu["そば"] = "600円"
p menu
出力結果:
{"うどん"=>"300円", "ラーメン"=>"500円", "パスタ"=>"800円"}
{"うどん"=>"300円", "ラーメン"=>"500円", "パスタ"=>"800円", "そば"=>"600円"}
要素の更新
Hashの要素を更新したいときは更新したい要素のキーを指定し新たな値を代入します。
Hash名[更新したい要素のキー] =値
以下のコードではキー名「うどん」の値を更新しています。
menu = {"うどん" => "300円", "ラーメン" => "500円", "パスタ" => "800円"}
p menu
menu["うどん"] = "600円"
p menu
出力結果:
{"うどん"=>"300円", "ラーメン"=>"500円", "パスタ"=>"800円"}
{"うどん"=>"600円", "ラーメン"=>"500円", "パスタ"=>"800円"}
要素の削除
要素を削除するにはdeleteメソッドを使用します。
Hash名.delete(削除したい要素のキー)
以下のコードではキー名「うどん」の要素を削除しています。
menu = {"うどん" => "300円", "ラーメン" => "500円", "パスタ" => "800円"}
p menu
menu.delete("うどん")
p menu
出力結果:
{"うどん"=>"300円", "ラーメン"=>"500円", "パスタ"=>"800円"}
{"ラーメン"=>"500円", "パスタ"=>"800円"}
RubyのHashでよく使うメソッド
Rubyには、上記で紹介してきたメソッド以外にもHashを操作するためにいくつものメソッドが用意されています。今回はその中でも使われることの多いメソッドを紹介します。
eachメソッド:Hashの要素数だけブロックを繰り返し実行
eachメソッドを使うことでHashの要素の数と同じ回数指定した処理を繰り返すことができます。
これを利用することで、Hashの要素を順番に表示するなどの処理が可能です。
eachメソッドは以下のような作りになっています。
配列名.each do |ブロックパラメータ|
繰り返したい処理
end
これだけではわかりづらいので、menuのすべての要素(キーとバリュー)を順番に表示するというコードを例に説明します。
menu = {"うどん" => "300円", "ラーメン" => "500円", "パスタ" => "800円"}
menu.each{
|name, price|
p "#{name}は#{price}です。"
}
出力結果:
うどんは300円です。
ラーメンは500円です。
パスタは800円です。
ブロックの引数にはキーとバリューに対応する任意の変数名を指定します。
今回はキーの引数を「name」、バリューの引数を「price」としています。このブロック引数にHashの要素が順番に入っていくと考えてください。
1周目は「うどん」が「name」、「300円」が「price」に代入されます。2周目は「ラーメン」が「name」、「500円」が「price」に代入される。という処理を配列の要素数分繰り返します。
lengthメソッド:Hashの要素数を調べる
Hashの要素数を調べるにはlengthメソッドを使います。lengthメソッドはHashの要素数を整数で返します。
Hash名.length
使用例は以下の通りです。
menu = {"うどん" => "300円", "ラーメン" => "500円", "パスタ" => "800円"}
p menu.length
出力結果:
3
empty?メソッド:Hashが空かを調べる
Hashが空(要素数0)かどうかはempty?メソッドを使って調べることができます。
empty?メソッドはHashが空であればtrue、1つ以上の要素があればfalseを返します。
Hash名.empty?
使用例は以下の通りです。
menu = {"うどん" => "300円", "ラーメン" => "500円", "パスタ" => "800円"}
p menu.empty?
出力結果:
false
まとめ
今回はRubyのHashについて解説してきました。
Hashは配列のように複数の要素を扱うことができ、キーとバリューを関連付けたいときに非常に有用です。
Rubyでプログラミングをおこなう際にHashは必ずと言っていいほど使用することになるので、ぜひ使いこなせるようになりましょう。