【Ruby】ハッシュ(Hash)の概要および使い方まとめ【初心者向け】

  • 2020年4月12日
  • 2021年10月16日
  • Ruby

今回は、Ruby初心者の方々に向けて、ハッシュ(Hash)の概要およびその基本的な使い方についてご紹介させていただきます。

ハッシュは実際に開発する中で必ずと言ってよいほど使用することとなり、なおかつ非常に便利なオブジェクトです。

「まだいまいちハッシュの使い方が分からない」という方は、この記事でご紹介する内容をマスターしておけば、その便利さに改めて感動すること間違いなしです。

初心者の方向けに分かりやすく簡潔にご説明していきますので、ぜひ最後まで読んでみてください。

なお、Rubyの魅力や特徴については以下の記事で詳しく解説していますので、こちらもぜひご覧くださいね。

おすすめ記事

みなさんこんにちは! 今回の記事は、 悩みを抱えた人 ・Rubyってどんなプログラミング言語なの?・Rubyを勉強すると将来役に立つかな?・Rubyのおすすめの学習方法が知りたい! というお悩みを解決する記事にな[…]

Rubyとは?その特徴や将来性、おすすめの学習方法まで網羅的にご紹介します

レバテックフリーランス … 業界最大級の案件数業界トップクラスの高単価報酬を誇る最大手のサービスです。実績豊富なコーディネーターが丁寧な対応をしてくれるため、案件の無理な提案はありません。フリーランスで生きていくためにはまず登録しておきましょう。
MidWorks … フリーランス賠償責任保障生命保険の折半など、フリーランスでありながらも正社員並みの保障を受けられるのが特徴です。また、経験豊富なキャリアコンサルタントによる手厚いサポートも受けられるため、安定したフリーランス生活を送りたい方には特におすすめのサービスです。
ポテパンフリーランス … IT業界・技術に詳しいコンサルタントが担当してくれるため、こちらの要望をきちんと理解した上で案件を紹介してくれます。また、案件情報のみならず、フリーランスのイロハについても教えてくれるため、フリーランスとして初めて活動される方には特におすすめのサービスです。

レバテックキャリア … ITエンジニアが利用したい転職エージェントNo.1にも選ばれており、年収600万円以上のハイクラス求人を5,000件以上も保有しています。エンジニアが転職を考えた時にまず初めに登録しておくべきサービスです。
Tech Stars Agent … Tech Stars Agentでは、担当エージェントが全員エンジニア出身のため、スキルやキャリアを見据えたきめ細かな転職支援が受けられます。運営元の株式会社Branding Engineerは、独立支援サービス「MidWorks」も展開しているため、独立を視野に入れたサポートも受けられます
転職ドラフト … 年収UP率93.8%/平均年収UP額126万円と圧倒的な年収UP率を誇るイベント型のエンジニア向け 転職サービスです。毎月1回開催され、厳選された優良IT/Web系企業約150社からダイレクトスカウトを受け取ることができます。年収アップを目指す方は登録必須です。

ハッシュ(Hash)とは?

ハッシュとは、「キー(Key)」と「バリュー(Value)」を持ったオブジェクトで、その「キー」を問い合わせることで、それに対応した「バリュー」が取得できる(キーとバリューが関連付けられている)ものです。

早速よく分からない単語が出てきましたが、文章だけではイメージが湧きづらいと思いますので、まずは実例を見てみましょう。

{ name: "田中太郎", tel: "09012345678", address: "東京都世田谷区", gender: "男", age: "15" }

このように、ハッシュは{ key: value, key: value, ... }の形式で表されます。

上記の例を用いると、「『このユーザーの〇〇は××』です」の部分の “〇〇” がkeyで、”××” がvalueだと捉えて頂いて結構です。

ハッシュを用いることで、「ユーザーの名前が知りたい」という場合に以下のようにとても簡単にその情報を得ることができます(※詳細方法は後述します)。

irb(main):001:0> user_infomation = { name: "田中太郎", tel:  "09012345678", address:  "東京都世田谷区", gender:  "男", age:  "15" }
irb(main):002:0> user_name = user_infomation[:name]
irb(main):003:0> user_name

=> "田中太郎"

配列との違い

では、以前ご説明した配列とは、どのような違いがあるのでしょうか?

ハッシュも配列も複数の要素を管理するために使用するという点では共通していますが、配列の場合、ハッシュのような「キー」は存在していません

そのため、上記の例を用いて同じような配列を作成してみると以下のようになります。

["田中太郎", "09012345678", "東京都世田谷区", "男", "15"]

なんとなく、どの要素が何を表しているのかは分かりますが、最後の “15” になると一体何が “15” なのかは分かりませんよね。

このように、キーとバリューを組み合わせて使用する必要のあるデータの場合にはハッシュが大きな力を発揮します。

なお、配列については以下の記事にて詳しくご紹介していますので、ぜひこちらもご覧くださいね。

おすすめ記事

今回は、Rubyの配列(Array)の基本的な使い方についてご紹介させていただきます。 Webアプリケーションを開発する中で、配列は必ずと言ってよいほど使用することとなるオブジェクトになります。 そのため、今回ご紹介する、基本[…]

プログラミングイメージ

ハッシュ(Hash)を作成する方法

さて、ハッシュの概要をご紹介したところで、ここからはハッシュの基本的な使い方をご紹介していきます。

まずは、ハッシュを作成する方法です。

ハッシュを作成する方法には、主に以下の3つがあります。

  • 1. { key: value }
  • 2. { key => value }
  • 3. Hash.new

それぞれ順を追ってご紹介していきますね。

その1 { key: value }

まずご紹介するのは「{ key: value }」で作成する方法です。

この{ key: value }を用いた作成方法は、ハッシュを作成する際に最も使用されている且つ分かりやすい書き方です。

{ name: "田中太郎", tel: "09012345678", address: "東京都世田谷区", gender: "男", age: "15" }

その2 { key => value }

続いてご紹介するのは「{ key => value }」で作成する方法です。

この{ key => value }ですが、先ほどご紹介した{ key: value }とは少しだけ異なっており、keyの部分がシンボルではなく文字列になっています。

{ "name" => "田中太郎", "tel" => "09012345678", "address" => "東京都世田谷区", "gender" => "男", "age" => "15" }

シンボルと文字列の違いについては、以下の記事にて少しだけ触れてはいますが、処理速度やその特性の観点から、ハッシュではシンボルを用いた方法({ key: value })をお勧めします

おすすめ記事

今回は、Rubyの配列(Array)の基本的な使い方についてご紹介させていただきます。 Webアプリケーションを開発する中で、配列は必ずと言ってよいほど使用することとなるオブジェクトになります。 そのため、今回ご紹介する、基本[…]

プログラミングイメージ

その3 Hash.new

最後にご紹介するのは「Hash.new」で作成する方法です。

このHash.newを使用すると、バリューの初期値を設定することができます

# 引数なしの場合
irb(main):001:0> user_infomation = Hash.new()
irb(main):002:0> user_infomation
=> {}
irb(main):003:0> user_infomation[:name]
=> nil

# 引数ありの場合
irb(main):001:0> user_infomation = Hash.new("田中太郎")
irb(main):002:0> user_infomation
=> {}
irb(main):003:0> user_infomation[:name]
=> "田中太郎"
irb(main):004:0> user_infomation[:age]
=> "田中太郎"

このように、引数を指定することによって、特にキーとバリューを設定しなくとも初期値が設定されているのがお分かりいただけるかと思います。

ただし、キーの種類を問わず全て初期値が設定されてしまいますので、この点はご注意くださいね(※もちろん、あくまで初期値ですので、値の更新は可能です)。

ハッシュ(Hash)の要素を取得する方法

続いては、ハッシュの要素を取得する方法をご紹介します。

ハッシュの要素を取得する方法には主に以下の2つがあります。

  • 1. Hash[key]
  • 2. fetch

その1 Hash[key]

一般的に、ハッシュからバリューを取得する場合には、取得したいバリューのキーを指定します。

irb(main):001:0> user_infomation = { name: "田中太郎", tel:  "09012345678", address:  "東京都世田谷区", gender:  "男", age:  "15" }
irb(main):002:0> user_infomation[:name]
=> "田中太郎"
irb(main):003:0> user_infomation[:address]
=> "東京都世田谷区"
irb(main):003:0> user_infomation[:height]
=> nil

上記のように、キーを指定することでそのキーが持っているバリューを取得することができます。

なお、存在しないキーを指定するとnilが返ってきますのでご注意くださいね。
(※先ほどのHash.newを使うと初期値が返すことが可能です)

その2 fetchメソッド

続いてご紹介するのは、「fetch」メソッドです。

このfetchメソッドですが、基本的な使い方は先ほどご紹介したHash[key]と同じなのですが、存在しないキーを指定するとエラーが発生するようになっています。

irb(main):001:0> user_infomation = { name: "田中太郎", tel:  "09012345678", address:  "東京都世田谷区", gender:  "男", age:  "15" }
irb(main):002:0> user_infomation.fetch(:name)
=> "田中太郎"
irb(main):003:0> user_infomation.fetch(:address)
=> "東京都世田谷区"
irb(main):003:0> user_infomation.fetch(:height)
=> KeyError (key not found: :height)

このように、存在しないキー(”height”)を指定したことで、KeyErrorが発生しており、通常の方法と比べて例外処理がしやすいようになっています。

また、第二引数に値を指定することで、KeyErrorの代わりにその値を返すことも可能です

irb(main):001:0> user_infomation = { name: "田中太郎", tel:  "09012345678", address:  "東京都世田谷区", gender:  "男", age:  "15" }
irb(main):002:0> user_infomation.fetch(:height)
=> KeyError (key not found: :height)
irb(main):003:0> user_infomation.fetch(:height, 180)
=> 180

エラーが回避できるだけでなく、初期値も設定できるので、非常に使いやすいメソッドですよね。

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

続いては、ハッシュに要素を追加する方法です。

ハッシュに要素を追加する方法には主に以下の2つがあります。

  • 1. Hash[key] = value
  • 2. store

その1 Hash[key] = value

一般的に、ハッシュに新たに要素を追加する場合には、追加したい要素のキーとバリューを指定するだけで大丈夫です。

irb(main):001:0> user_infomation = { name: "田中太郎", tel:  "09012345678", address:  "東京都世田谷区", gender:  "男", age:  "15" }
irb(main):002:0> user_infomation[:height] = 180
irb(main):003:0> user_infomation[:height]
=> 180

なお、既に存在しているキーを指定した場合には、そのバリューが更新されますので、こちらも併せて覚えておいてくださいね。

irb(main):001:0> user_infomation = { name: "田中太郎", tel:  "09012345678", address:  "東京都世田谷区", gender:  "男", age:  "15" }
irb(main):002:0> user_infomation[:name] = "田中花子"
irb(main):003:0> user_infomation[:name]
=> 田中花子

その2 storeメソッド

続いてご紹介するのは「store」メソッドです。

storeメソッドでは、第1引数にキーを、第2引数にバリューを設定することで要素を追加することができます。

irb(main):001:0> user_infomation = { name: "田中太郎", tel:  "09012345678", address:  "東京都世田谷区", gender:  "男", age:  "15" }
irb(main):002:0> user_infomation.store("height", 180)
irb(main):003:0> user_infomation[:height]
=> 180

こちらでご紹介した2種類の方法は、機能面では差異はありませんので、ご自身が使いたい方を使う形で問題ありません。

ハッシュ(Hash)から要素を削除する方法

続いては、ハッシュから要素を削除する方法です。

ハッシュから要素を削除する方法には主に以下の3つがあります。

  • 1. delete
  • 2. delete_if
  • 3. clear

その1 deleteメソッド

まずご紹介するのは「delete」メソッドです。

このdeleteメソッドですが、引数にキーを指定することで、そのキーとバリューを共に削除することができます

irb(main):001:0> user_infomation = { name: "田中太郎", tel:  "09012345678", address:  "東京都世田谷区", gender:  "男", age:  "15" }
irb(main):002:0> user_infomation.delete(:name)
=> "田中太郎"
irb(main):003:0> user_infomation
=> {:tel=>"09012345678", :address=>"東京都世田谷区", :gender=>"男", :age=>"15"}
irb(main):004:0> user_infomation.delete(:height)
=> nil

このように、指定したキーとバリューが丸ごと削除されているのがお分かりいただけると思います。

なお、削除に成功した場合には、削除されたバリューが、削除に失敗した場合にはnilが返ってきますのでご注意くださいね。

その2 delete_ifメソッド

まずご紹介するのは「delete_if」メソッドです。

delete_ifメソッドはブロックを取ることができ、条件式に合致した要素を全て削除することができます

irb(main):001:0> user_infomation = { name: "田中太郎", tel:  "09012345678", address:  "東京都世田谷区", gender:  "男", age:  "15" }
irb(main):002:1* user_infomation.delete_if do |key, value|
irb(main):003:1*   value.size >= 4
irb(main):004:0> end
=> {:gender=>"男", :age=>"15"}
irb(main):005:0> user_infomation
=> {:gender=>"男", :age=>"15"}

条件式では、「4文字以上の要素を削除する」ように設定した結果、該当する要素が無事削除されていることがお分かりいただけるかと思います。

なお、条件式に合致する要素がなかった場合には、レシーバそのものを返します

irb(main):001:0> user_infomation = { name: "田中太郎", tel:  "09012345678", address:  "東京都世田谷区", gender:  "男", age:  "15" }
irb(main):002:1* user_infomation.delete_if do |key, value|
irb(main):003:1*   value.size >= 15
irb(main):004:0> end
=> { name: "田中太郎", tel:  "09012345678", address:  "東京都世田谷区", gender:  "男", age:  "15" }
irb(main):005:0> user_infomation
=> { name: "田中太郎", tel:  "09012345678", address:  "東京都世田谷区", gender:  "男", age:  "15" }

その3 clearメソッド

最後にご紹介するのは「clear」メソッドです。

このclearメソッドですが、その名の通り、ハッシュ内の全ての要素を削除してしまいます

irb(main):001:0> user_infomation = { name: "田中太郎", tel:  "09012345678", address:  "東京都世田谷区", gender:  "男", age:  "15" }
irb(main):002:0> user_infomation.clear
=> {}
irb(main):003:0> user_infomation
=> {}

ハッシュ(Hash)を扱う際に便利なメソッド一覧

さて、ここまでハッシュの基本的な使い方をご紹介してきましたが、最後にハッシュを扱う際に便利なメソッドをご紹介させていただきます。

今回ご紹介するメソッドは以下の10種類になります。

  • 1. find
  • 2. sort
  • 3. merge
  • 4. keys
  • 5. values
  • 6. has_key?
  • 7. has_value?
  • 8. values_at
  • 9. select
  • 10. reject

それぞれ順を追ってご説明させていただきますね。

その1 findメソッド

まずご紹介するのは「find」メソッドです。

findメソッドでは、キーやバリューを指定することで該当する要素を検索することができます

irb(main):001:0> fruits = { apple: 150, orange: 100, strawberry: 300, grape: 250 }
irb(main):002:1* fruits.find do |name, price|
irb(main):003:1*   price = 150
irb(main):004:0> end
=> [:apple, 150]

なお、該当する要素が複数ある場合には、最初に合致した要素のみ返しますので、この点はご注意くださいね。

irb(main):001:0> fruits = { apple: 150, orange: 100, strawberry: 300, grape: 250 }
irb(main):002:1* fruits.find do |name, price|
irb(main):003:1*   price >= 100
irb(main):004:0> end
=> [:apple, 150]

その2 sortメソッド

続いてご紹介するのは「sort」メソッドです。

sortメソッドを使うと、キーやバリューを元にハッシュ内の要素を並び替えることができます

キーを元に並び替えたい場合には、そのままsortメソッドを使用します。

irb(main):001:0> fruits = { apple: 150, orange: 100, strawberry: 300, grape: 250 }
irb(main):002:0> fruits.sort
=> [[:apple, 150], [:grape, 250], [:orange, 100], [:strawberry, 300]]

バリューを元に並び替えたい場合には、以下のようにsort_byメソッドを使用します。

irb(main):001:0> fruits = { apple: 150, orange: 100, strawberry: 300, grape: 250 }
irb(main):002:0> fruits.sort_by { |name, price| price }
=> [[:orange, 100], [:apple, 150], [:grape, 250], [:strawberry, 300]]

いずれも昇順で並び替えられましたが、降順で並び替えたい場合には、さらにreverseメソッドを足してあげると大丈夫です。

その3 mergeメソッド

続いてご紹介するのは「merge」メソッドです。

mergeメソッドを使うと、2つのハッシュを結合することができます

irb(main):001:0> fruits1 = { apple: 150, orange: 100 }
irb(main):002:0> fruits2 = { strawberry: 300, grape: 250 }
irb(main):003:0> fruits1.merge(fruits2)
=> {:apple=>150, :orange=>100, :strawberry=>300, :grape=>250 }
irb(main):004:0> fruits1
=> {:apple=>150, :orange=>100 }

このように、簡単にハッシュが結合できているのがお分かりいただけるかと思います。

ただし、mergeメソッドは非破壊的メソッドですので、レシーバ側のハッシュには変更は加わっていません

レシーバ側のハッシュも変更したい場合には、破壊的メソッドのmerge!メソッドを使用してください。

irb(main):001:0> fruits1 = { apple: 150, orange: 100 }
irb(main):002:0> fruits2 = { strawberry: 300, grape: 250 }

# mergeメソッドの場合
irb(main):003:0> fruits1.merge(fruits2)
=> {:apple=>150, :orange=>100, :strawberry=>300, :grape=>250 }
irb(main):004:0> fruits1
=> {:apple=>150, :orange=>100 }

# merge!メソッドの場合
irb(main):005:0> fruits1.merge!(fruits2)
=> {:apple=>150, :orange=>100, :strawberry=>300, :grape=>250 }
irb(main):006:0> fruits1
=> {:apple=>150, :orange=>100, :strawberry=>300, :grape=>250 }

その4 keysメソッド

続いてご紹介するのは「keys」メソッドです。

keysメソッドを使用すると、レシーバのハッシュに登録されているキーを全て取得することができます

irb(main):001:0> fruits = { apple: 150, orange: 100, strawberry: 300, grape: 250 }
irb(main):002:0> fruits.keys
=> [:apple, :orange, :strawberry, :grape]

その5 valuesメソッド

続いてご紹介するのは「values」メソッドです。

valuesメソッドを使用すると、レシーバのハッシュに登録されているバリューを全て取得することができます

irb(main):001:0> fruits = { apple: 150, orange: 100, strawberry: 300, grape: 250 }
irb(main):002:0> fruits.values
=> [150, 100, 300, 250]

その6 has_key?メソッド

続いてご紹介するのは「has_key?」メソッドです。

has_key?メソッドを使用すると、引数として指定した値がハッシュのキーとして含まれているかどうかを確かめることができます

irb(main):001:0> fruits = { apple: 150, orange: 100, strawberry: 300, grape: 250 }
irb(main):002:0> fruits.has_key?("apple")
=> true
irb(main):003:0> fruits.has_key?("peach")
=> false

また、エイリアスメソッドとして、key?include?member?も存在していますので、ご自身で使いやすいものを使ってくださいね。

その7 has_value?メソッド

続いてご紹介するのは「has_value?」メソッドです。

has_value?メソッドを使用すると、引数として指定した値がハッシュのバリューとして含まれているかどうかを確かめることができます

irb(main):001:0> fruits = { apple: 150, orange: 100, strawberry: 300, grape: 250 }
irb(main):002:0> fruits.has_value?(250)
=> true
irb(main):003:0> fruits.has_value?(200)
=> false

その8 values_atメソッド

続いてご紹介するのは「values_at」メソッドです。

values_atメソッドを使うと、指定したキーに対応するバリューを取得することができます。

irb(main):001:0> fruits = { apple: 150, orange: 100, strawberry: 300, grape: 250 }
irb(main):002:0> fruits.values_at(:apple)
=> [150]

また、戻り値が配列になっていることからもお分かりの通り、引数には複数の値を指定することもでき、該当するキーがない場合にはnilが返ってきます。

irb(main):001:0> fruits = { apple: 150, orange: 100, strawberry: 300, grape: 250 }
irb(main):002:0> fruits.values_at(:apple, :orange, :peach)
=> [150, 100, nil]

その9 selectメソッド

続いてご紹介するのは「select」メソッドです。

selectメソッドを使うと、条件式に合致した要素のみ取り出すことができます。

irb(main):001:0> fruits = { apple: 150, orange: 100, strawberry: 300, grape: 250 }
irb(main):002:1* fruits.select do |name, price|
irb(main):003:1*   price <= 200
irb(main):004:0> end
=> {:apple=>150, :orange=>100}

このように、バリューが200以下のもののみ取り出されているのがお分かりいただけるかと思います。

その10 rejectメソッド

最後にご紹介するのは「reject」メソッドです。

rejectメソッドは先ほどご紹介したselectメソッドとは逆で、条件式に合致しない要素のみ取り出すことができます。

irb(main):001:0> fruits = { apple: 150, orange: 100, strawberry: 300, grape: 250 }
irb(main):002:1* fruits.reject do |name, price|
irb(main):003:1*   price <= 200
irb(main):004:0> end
=> {:strawberry=>300, :grape=>250}

お仕事の途中ですが、少し一休みして、転職独立について考えてみませんか🙌?

現役エンジニアが選ぶおすすめの転職エージェント11選【成功談・失敗談もあります】

レバテックフリーランスの評判ってどう?【現役エンジニアが徹底解説します】

MidWorks(ミッドワークス)の評判ってどう?【現役エンジニアが徹底解説します】

日々の業務に追われて自分を見失わないよう、
定期的にキャリアを振り返るようにしておきましょう🤲

最後に

さて、ここまで、ハッシュ(Hash)の概要およびその基本的な使い方についてご紹介してきましたがいかがでしたか?

今回ご紹介したものは、あくまで基本的な使い方およびメソッドになりますので、もしハッシュに興味を持っていただけましたら、ご自身でも色々と調べてみてください。

また、この記事を読んでいただければ、普段の開発でも特段困ることはなくなるはずですので、これからはどんどん積極的にハッシュ(Hash)を使ってみてくださいね。

このブログを通じて少しでも「傍(はた)を楽(らく)にする」ことができていれば嬉しく思います。

最後まで読んで頂きありがとうございました。