ひろこま Hack Log

プログラミングや機械学習などの知識を記録・共有します

Rubyの深いハッシュで、ある要素が未定義かどうかを判定

f:id:twx:20191120140217p:plain
rubyで深いハッシュを扱うときのコツ

以下のような深いハッシュがあるとする。

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

Koma Hirokazu 's Hacklog ―― Copyright © 2018 Koma Hirokazu