Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Ruby辞典

  1. トップページ
  2. Ruby辞典
  3. ハッシュ.fetch / store / delete / merge

ハッシュ.fetch / store / delete / merge

ハッシュの値の取得・設定・削除・結合を行うメソッドです。安全な値取得の『fetch』、複数ハッシュの結合の『merge』など、実践でよく使われます。

構文
# キーに対応する値を取得します(存在しない場合はデフォルト値かエラー)。
ハッシュ.fetch(キー)
ハッシュ.fetch(キー, デフォルト値)
ハッシュ.fetch(キー) { |k| デフォルト値の計算 }

# キーと値を設定します。
ハッシュ.store(キー, 値)
ハッシュ[キー] = 値

# キーと対応する値を削除します。
ハッシュ.delete(キー)
ハッシュ.delete(キー) { |k| 見つからない場合の処理 }

# ハッシュを結合した新しいハッシュを返します。
ハッシュ.merge(他のハッシュ)
ハッシュ.merge(他のハッシュ) { |key, old, new| 衝突時の処理 }
ハッシュ.merge!(他のハッシュ)   # 破壊的
メソッド一覧
メソッド概要
fetch(key)キーに対応する値を返します。キーが存在しない場合は KeyError を発生させます。
fetch(key, default)キーが存在しない場合にデフォルト値を返します。
store(key, value)キーと値のペアを設定します。『[]=』と同義です。
delete(key)指定したキーと値を削除し、削除した値を返します。存在しない場合は『nil』を返します。
delete_if { |k, v| ... }ブロックが『true』を返すペアをすべて削除します(破壊的)。
merge(other)2つのハッシュを結合した新しいハッシュを返します。キーが重複する場合は引数側の値が優先されます。
merge!(other)元のハッシュに別のハッシュを結合します(破壊的)。『update』も同義です。
slice(k1, k2, ...)指定したキーのペアだけを含む新しいハッシュを返します。
サンプルコード
config = { host: 'localhost', port: 3000 }

# fetch:存在しないキーへのアクセスを安全に
puts config.fetch(:host)           # "localhost"
puts config.fetch(:timeout, 30)    # 30(デフォルト値)
puts config.fetch(:name) { |k| "#{k}は設定されていません" }
# => "nameは設定されていません"

# store / [] = で値を設定
config.store(:ssl, false)
config[:debug] = true
puts config.inspect
# {:host=>"localhost", :port=>3000, :ssl=>false, :debug=>true}

# delete で削除
deleted = config.delete(:debug)
puts deleted        # true(削除した値)
puts config.inspect # {:host=>"localhost", :port=>3000, :ssl=>false}

# merge:ハッシュの結合
defaults = { timeout: 60, retry: 3, debug: false }
custom   = { debug: true, host: 'example.com' }
merged = defaults.merge(custom)
puts merged.inspect
# {:timeout=>60, :retry=>3, :debug=>true, :host=>"example.com"}

# merge でキー衝突時の処理をカスタマイズ
h1 = { a: 1, b: 2 }
h2 = { b: 3, c: 4 }
result = h1.merge(h2) { |key, old, new_val| old + new_val }
puts result.inspect  # {:a=>1, :b=>5, :c=>4}(bは1+2+3でなく2+3=5)

# slice:必要なキーだけ取り出す
user = { id: 1, name: '太郎', password: 'secret', email: 'taro@example.com' }
public_info = user.slice(:id, :name, :email)
puts public_info.inspect  # {:id=>1, :name=>"太郎", :email=>"taro@example.com"}
概要

『[]』でキーにアクセスすると、存在しないキーは黙って『nil』を返します。意図しない『nil』の混入を防ぐには、キーの存在が必須な場合は『fetch』を使うことを推奨します。『fetch』はキーが存在しないとき『KeyError』を発生させるため、バグを早期に発見できます。

『merge』は新しいハッシュを返す非破壊的メソッドです。元のハッシュを変更したい場合は『merge!』(または『update』)を使います。ブロックを渡すと、重複したキーに対してどちらの値を使うかを細かく制御できます。

Ruby 2.5以降で追加された『slice』は、ハッシュから必要なキーだけを取り出すのに便利です。APIレスポンスから不要なフィールドを除外する場合などに活用できます。逆に特定のキーを除外したい場合はrejectを使います。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。