ハッシュとは
キーと値の組み合わせでデータを管理するオブジェクト
よく使用されるハッシュのメソッド
- keys
- value
- has_key?
- dig
- values_at
keys
ハッシュのキーを配列として返す
currencies = { japan: 'yen', us: 'dollar', india: 'rupee' }
currencies.keys
=> [:japan, :us, :india]
values
ハッシュの値を配列として返す
currencies = { japan: 'yen', us: 'dollar', india: 'rupee' }
currencies.values
=> ["yen", "dollar", "rupee"]
has_key?
ハッシュの中に指定されたキーが存在するか確認できる
currencies = { japan: 'yen', us: 'dollar', india: 'rupee' }
currencies.has_key?(:us)
=> true
currencies.has_key?(:germany)
=> false
values_at
ハッシュのキーに対応する値を配列として返す
対応するキーが無かったら、nilを返す
currencies = { japan: 'yen', us: 'dollar', india: 'rupee' }
currencies.values_at(:japan, :india, :canada)
=> ["yen", "rupee", nil]
dig
ネストしたハッシュから安全に値を取り出すことが出来る
order = {
payments: {
payment_method: {
name: 'credit card'
}
}
}
nameの値を取り出した場合は、以下のように取り出せる
order[:payments][:payment_method][:name]
=> "credit card"
何らかの理由でpayment_methodの情報が入ってなかったとして、先程と同じようにnameの値を取得しようとするとエラーが発生する
other_order = {
payments: {
#payment_methodが存在しない
}
}
other_order[:payments][:payment_method][:name]
NoMethodError (undefined method `[]' for nil:NilClass)
このような場合にdigメソッドを使用すると、キーが見つからなくてもnil
が返るようになる
order.dig(:payments, :payment_method, :name)
=> "credit card"
other_order.dig(:payments, :payment_method, :name)
=> nil
digメソッドは配列やハッシュが混在していても使用できる
all_order = [
{
payments: {
payment_method: {
name: 'credit card'
}
}
},
{
payments: {
payment_method: {
# payment_method情報が存在しない
}
}
},
{
payments: {
payment_method: {
name: 'cash'
}
}
}
]
all_order.dig(0, :payments, :payment_method, :name)
=> "credit card"
all_order.dig(1, :payments, :payment_method, :name)
=> nil
all_order.dig(2, :payments, :payment_method, :name)
=> "cash"