ハッシュ(Hash)はキーと値のペアでデータを管理するデータ構造です。配列がインデックス番号でデータを管理するのに対し、ハッシュは任意のキーでデータにアクセスできます。ユーザー情報や設定データなど、名前付きでデータを管理したい場面で広く使われます。
基本的な使い方
ハッシュの作成
ハッシュは波括弧{}で作成し、キーと値を=>またはシンボルを使って記述します。
Ruby
# ロケット記法(=>)
person1 = {'name' => '太郎', 'age' => 25, 'city' => '東京'}
# シンボル記法(推奨)
person2 = {name: '花子', age: 22, city: '大阪'}
puts person1
puts person2実行結果
{"name"=>"太郎", "age"=>25, "city"=>"東京"}
{name: "花子", age: 22, city: "大阪"}現在のRubyではシンボル記法(key: value)が主流です。シンボルは文字列よりもメモリ効率が良く、キーとして最適です。
値へのアクセス
Ruby
user = {name: '太郎', age: 25, email: 'taro@example.com'}
puts user[:name]
puts user[:age]
puts user[:email]
puts user[:phone] # 存在しないキーはnilを返す実行結果
太郎
25
taro@example.com
要素の追加・更新・削除
Ruby
user = {name: '太郎', age: 25}
# 要素の追加
user[:email] = 'taro@example.com'
user[:city] = '東京'
puts "追加後: #{user}"
# 要素の更新
user[:age] = 26
puts "更新後: #{user}"
# 要素の削除
user.delete(:city)
puts "削除後: #{user}"実行結果
追加後: {name: "太郎", age: 25, email: "taro@example.com", city: "東京"}
更新後: {name: "太郎", age: 26, email: "taro@example.com", city: "東京"}
削除後: {name: "太郎", age: 26, email: "taro@example.com"}便利なメソッド
Ruby
config = {host: 'localhost', port: 3000, debug: true}
puts "キー一覧: #{config.keys}"
puts "値一覧: #{config.values}"
puts "要素数: #{config.length}"
puts "キー存在?: #{config.key?(:host)}"
puts "値存在?: #{config.value?(3000)}"
puts "空?: #{config.empty?}"実行結果
キー一覧: [:host, :port, :debug]
値一覧: ["localhost", 3000, true]
要素数: 3
キー存在?: true
値存在?: true
空?: falseハッシュの繰り返し処理
Ruby
scores = {math: 85, english: 92, science: 78}
# キーと値の両方を取得
scores.each do |subject, score|
puts "#{subject}: #{score}点"
end
puts '---'
# 値だけで処理
total = scores.values.sum
average = total.to_f / scores.length
puts "合計: #{total}点"
puts "平均: #{average.round(1)}点"実行結果
math: 85点
english: 92点
science: 78点
---
合計: 255点
平均: 85.0点実践的な使い方
Ruby
# 商品管理システム
products = [
{name: 'ノートPC', price: 89800, stock: 15},
{name: 'マウス', price: 2980, stock: 50},
{name: 'キーボード', price: 7980, stock: 0},
{name: 'モニター', price: 34800, stock: 8}
]
puts '--- 商品一覧 ---'
products.each do |product|
status = product[:stock] > 0 ? '在庫あり' : '在庫切れ'
puts "#{product[:name]}: #{product[:price]}円(#{status})"
end
# 在庫ありの商品だけ抽出
available = products.select { |p| p[:stock] > 0 }
puts "\n在庫あり: #{available.length}件"
# 合計在庫金額
total_value = products.sum { |p| p[:price] * p[:stock] }
puts "在庫総額: #{total_value}円"実行結果
--- 商品一覧 ---
ノートPC: 89800円(在庫あり)
マウス: 2980円(在庫あり)
キーボード: 7980円(在庫切れ)
モニター: 34800円(在庫あり)
在庫あり: 3件
在庫総額: 1774400円fetchメソッドで安全にアクセス
hash[:key]は存在しないキーでnilを返しますが、hash.fetch(:key)はエラーを発生させます。hash.fetch(:key, 'デフォルト値')でデフォルト値の指定もできます。
文字列キーとシンボルキーは別物
{name: '太郎'}と{'name' => '太郎'}ではキーの型が異なります。シンボルキーの場合hash[:name]、文字列キーの場合hash['name']でアクセスします。混在させるとバグの原因になるため、シンボルに統一しましょう。
まとめ
- ハッシュは
{key: value}の形式でキーと値のペアを管理する - シンボル記法(
key: value)が現在の主流 eachでキーと値の両方を取り出して繰り返し処理できるkeys、values、key?、deleteなどの便利なメソッドがあるfetchで安全に値を取得し、存在しないキーへのアクセスを防げる