今回は配列とハッシュから安全に値を取り出すことができるdigメソッドについて紹介したいと思います。配列ではArrayオブジェクト[index]のように、ハッシュからはハッシュオブジェクト[キー]のようにも値を取得することができますが、digメソッドで取得する際と比べて何が異なるのでしょうか。
digメソッドとは
digメソッドとは、配列とハッシュから安全に値を取り出すことができるメソッドになります。次の項目では、実際にdigメソッドを用いて値を取り出す方法について見ていきます。
配列の場合
以下のような配列があると仮定し、digメソッドを用いてそれぞれの値を取り出してみます。digメソッドの引数に取得したい値のindexを指定していくことで値を取り出すことができます。
fruits =
[
[ "apple",
[ "banana", "grape" ]
]
]
# appleを取得する
fruits.dig(0, 0)
=> "apple"
# bananaを取得する
fruits.dig(0, 1, 0)
=> "banana"
# grapeを取得する
fruits.dig(0, 1, 1)
=> "grape"
ハッシュの場合
以下のようなハッシュがあると仮定し、digメソッドを用いてそれぞれの値を取り出してみます。digメソッドの引数に取得したい値のキーを指定していくことで値を取り出すことができます。
users =
{
name: {
first_name: '太郎',
last_name: '田中'
},
age: 25
}
# ageを取得
users.dig(:age)
=> 25
# first_nameを取得
users.dig(:name, :first_name)
=> "太郎"
# last_nameを取得
users.dig(:name, :last_name)
=> "田中"
配列とハッシュの入れ子構造の場合
以下のような配列とハッシュの入れ子構造があると仮定し、digメソッドを用いてそれぞれの値を取り出してみます。配列とハッシュの場合同様、それぞれindexもしくはキーを指定することで取得することができます。
users =
[
"佐藤",
profile: {
age: 30,
hobbys: {
sports: "サッカー",
manga: "ワンピース"
}
}
]
# nameを取得
users.dig(0)
=> "佐藤"
# ageを取得
users.dig(1, :profile, :age)
=> 30
# sportsを取得
users.dig(1, :profile, :hobbys, :sports)
=> "サッカー"
# mangaを取得
users.dig(1, :profile, :hobbys, :manga)
=> "ワンピース"
digメソッドのメリット
digメソッドを使用せずとも、配列ではArrayオブジェクト[index]のように、ハッシュではハッシュオブジェクト[キー]のようにも値を取得することができます。
しかしArrayオブジェクト[index]やハッシュオブジェクト[キー]で値を取得する際、データがなかった場合はエラーが発生してしまいます。この場合を先ほどの配列とハッシュの入れ子構造で見ていきます。
users =
[
"佐藤",
profile: {
age: 30,
hobbys: {
sports: "サッカー",
manga: "ワンピース"
}
}
]
# Arrayオブジェクト[index]」や「ハッシュオブジェクト[キー]で値を取得する
# sportsを取得
users[:profile][:hobbys][:sports]
=> "サッカー"
# 存在しないmusic、rockを取得しようとする
users[:profile][:hobbys][:music][:rock]
=> NoMethodError: undefined method `[]' for nil:NilClass
一方でdigメソッドを使用して値を取得する場合、エラーは発生せずnilを返してくれるようになります。これが配列とハッシュから安全に値を取り出すことができる理由になります。
# digメソッドを用いて値を取得する場合
# 存在しないmusic、rockを取得しようとする
users.dig(1, :profile, :hobbys, :music, :rock)
=> nil
まとめ
- digメソッドとは、配列とハッシュから安全に値を取り出すことができるメソッド
- 配列の場合、digメソッドの引数に取得したい値のindexを指定することで取り出すことができる
- ハッシュの場合、digメソッドの引数に取得したい値のキーを指定することで取り出すことができる
- Arrayオブジェクト[index]やハッシュオブジェクト[キー]で値を取得する際にデータがなかった場合はエラーが返る
- digメソッドで値を取得する際にデータがなかった場合はnilが返る
参考
今回は配列とハッシュから安全に値を取り出すことができるdigメソッドについて紹介しました。ネストされた配列やハッシュから値を取り出す際は、digメソッドを用いて値を取り出すようにしましょう。