以下のような深いハッシュがあるとする。
x = {a: {b: {c: 1}}}
このハッシュに対して、 x[:a][:b][:d]
が存在するかどうかを判定したい。
直感的に、以下のようにすれば判定できそうだ。
x[:a][:b][:d]
結果は nil
が返ってくる。期待通りだ。
では次に x[:a][:e][:f]
が存在するか判定しよう。上と同様に
x[:a][:e][:f]
としてみる。 しかし、ここで問題が発生する。
x[:a][:e]
が nil
なので、それに続けて [:f]
を評価することができず、エラーが返ってくる。
このエラーを回避するためには、以下のようにして要素をひとつひとつ nil
か否か判定していかなくてはならない。
x[:a] && x[:a][:e] && x[:a][:e][:f]
hash.dig() を使おう
上記の方法でも問題ないが、判定式が長くなってしまい可読性が低くなる。そこで、 x[:a] && x[:a][:e] && x[:a][:e][:f]
をもっと簡単に書ける関数 dig
を使おう。
x.dig(:a,:e,:f)
これで、 nil
が返ってくる。
以上、Rubyで深いハッシュのある要素が未定義かどうかを判定する方法でした。
良い記事だと思っていただいた方は、以下の「★+」ボタンのクリック、SNSでのシェア、「読者になる」ボタンのクリック、Twitterのフォローをお願いします!
検索用キーワード: ruby element of deep hash is undefined or not, check whether a nested hash element exists