こんにちは、かつコーチです。
「配列は分かったけど、ハッシュとの違いがよく分からない」。
Ruby学習を進める中で、この壁にぶつかる方は多いです。
この記事では、ハッシュの作成方法から、値の取得・追加・削除、each_pairでのループ処理までを解説します。
読み終える頃には、キーと値のペアでデータを扱う感覚がつかめるようになります。
基本の書き方
ハッシュとは
ハッシュとは、「キー」と「値」をペアにしてデータを管理する仕組みのことです。
配列がインデックス(0, 1, 2…)で要素を管理するのに対し、ハッシュは名前(キー)で値を管理します。
user = { "name" => "山田太郎", "age" => 30 }
puts user
# => {"name"=>"山田太郎", "age"=>30}
=>は「ハッシュロケット」と呼ばれ、キーと値を結びつける記号です。
シンボルキー記法
Rubyでは、キーにシンボルを使うのが一般的です。
シンボルとは、:nameのように、コロンから始まる軽量な文字列のようなオブジェクトのことです。
# ハッシュロケット記法
user = { :name => "山田太郎", :age => 30 }
# シンボルキー記法(省略形・推奨)
user = { name: "山田太郎", age: 30 }
puts user
# => {:name=>"山田太郎", :age=>30}
シンボルは文字列より処理が軽く、同じ値であれば同一のオブジェクトとして扱われます。
そのためキーとして使う場合、name:という省略形で書くのが今のRubyの主流です。
値の取得
ハッシュから値を取り出すには[キー]を使います。
user = { name: "山田太郎", age: 30 }
puts user[:name]
# => 山田太郎
puts user[:age]
# => 30
puts user[:email]
# => nil(存在しないキーはnilが返る)
値の追加・更新
[キー] = 値で新しいキーを追加したり、既存の値を更新したりできます。
user = { name: "山田太郎", age: 30 }
# 追加
user[:email] = "yamada@example.com"
puts user
# => {:name=>"山田太郎", :age=>30, :email=>"yamada@example.com"}
# 更新
user[:age] = 31
puts user[:age]
# => 31
値の削除
キーと値のペアを削除するにはdeleteメソッドを使います。
user = { name: "山田太郎", age: 30, email: "yamada@example.com" }
removed = user.delete(:email)
puts removed
# => yamada@example.com
puts user
# => {:name=>"山田太郎", :age=>30}
deleteメソッドは、削除した値を戻り値として返します。
each_pairでのループ処理
each_pairとは、ハッシュのキーと値のペアを1つずつ取り出して繰り返し処理するメソッドのことです。
user = { name: "山田太郎", age: 30, email: "yamada@example.com" }
user.each_pair do |key, value|
puts "#{key}: #{value}"
end
# => name: 山田太郎
# => age: 30
# => email: yamada@example.com
eachメソッドでも同じ結果が得られますが、each_pairと書くことで「キーと値のペアを扱っている」ことが明確になります。
よくあるつまずきポイント・エラー対処
文字列キーとシンボルキーの取り違え
私が初心者の頃、文字列キーで作ったハッシュをシンボルで取り出そうとしてハマったことがあります。
❌ Before
user = { "name" => "山田太郎", "age" => 30 }
puts user[:name]
# => nil(意図した値が取れない)
"name"という文字列キーで作ったハッシュに対し、:nameというシンボルキーでアクセスしていました。
Rubyでは"name"と:nameはまったく別のキーとして扱われるため、nilが返ってきてしまいます。
✅ After
user = { "name" => "山田太郎", "age" => 30 }
puts user["name"]
# => 山田太郎
または、最初からシンボルキーでハッシュを統一する方法もあります。
user = { name: "山田太郎", age: 30 }
puts user[:name]
# => 山田太郎
1つのハッシュの中では、キーの型(文字列かシンボルか)を統一しておくと、こうした取り違えを防げます。
まとめ
この記事のポイント
- ハッシュは「キー」と「値」のペアでデータを管理する
name:のようなシンボルキー記法が現在の主流- 値の取得・追加・更新は
[キー]、削除はdeleteメソッド each_pairでキーと値のペアを1つずつ処理できる- 文字列キーとシンボルキーは別物として扱われるため、統一して使う
次に読むべき記事
配列とハッシュの基本を押さえたら、次は条件分岐の書き方を学びましょう。
「if文・unless・三項演算子で条件分岐」で、条件によって処理を分ける方法を解説しています。