基礎

Rubyのハッシュ入門|キーと値のペアでデータを管理する方法

ハッシュ(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でキーと値の両方を取り出して繰り返し処理できる
  • keysvalueskey?deleteなどの便利なメソッドがある
  • fetchで安全に値を取得し、存在しないキーへのアクセスを防げる