コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

Rubyで二次元以上の配列もしくはハッシュの値を取るとき、要素数などが不明確な場合、digを使うとスムーズに取れる

知ってそうで知らないシリーズメモ

環境

$ ruby -v
ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin17]

2次元以上のHashから値を取ろうとした場合、1つ目のキー指定時に対象のものがないと2つ目以降が取れない。

# サンプル配列
hash = {a: {b: "val"}}
#=> {:a=>{:b=>"val"}}

# 1個目の値が存在するものなら問題なくとれる
hash[:a][:b]
#=> "val"

# 1個目の値がないと nil に対して処理をするのでエラー
hash[:x][:b]
#NoMethodError: undefined method `[]' for nil:NilClass
#  from (irb):5
#  from /usr/bin/irb:11:in `<main>'

こういう場合にdigを使うと存在しない場合はnilを結果に返してくれる

hash.dig(:a,:b)
#=> "val"

hash.dig(:x,:b)
#=> nil

配列にも使える

ary = [[10,20],[30,40]]
#=> [[10, 20], [30, 40]]

ary.dig(0,0)
#=> 10

# ありえない引数を指定する
ary[10][0]
#NoMethodError: undefined method `[]' for nil:NilClass
#  from (irb):11
#  from /usr/bin/irb:11:in `<main>'

ary.dig(10,0)
#=> nil

関連リンク