配列の配列の奥深くにある要素にアクセスしようとするとき、要素が存在しない場合に「nil:NilClass の undefined method `[]'」というエラーが発生しないようにする最善の方法は何ですか?
たとえば、私は現在これを行っていますが、私には悪いようです:
if @foursquare['response']['groups'][0].present? && @foursquare['response']['groups'][0]['items'].present?
配列の配列の奥深くにある要素にアクセスしようとするとき、要素が存在しない場合に「nil:NilClass の undefined method `[]'」というエラーが発生しないようにする最善の方法は何ですか?
たとえば、私は現在これを行っていますが、私には悪いようです:
if @foursquare['response']['groups'][0].present? && @foursquare['response']['groups'][0]['items'].present?
配列の内容によっては、.present?
. また、Ruby はそのような構造の最後の値を取るだけなので、if
ステートメントを省略できます。
@foursquare['response']['groups'][0] &&
@foursquare['response']['groups'][0]['items'] &&
@foursquare['response']['groups'][0]['items'][42]
この問題に対するより洗練されたソリューションは、egonil (ブログ投稿)、andand gem (ブログ投稿)、さらには Ruby 2.3 のセーフ ナビゲーション オペレーターです。
更新:最近の Ruby には#dig
メソッドが含まれており、この場合に役立つ可能性があります。詳細については、 user513951の回答を参照してください。
if @foursquare['response']['groups'][0].to_a['items']
. . .
を返すa をNilClass
実装することが起こります 。これは、everyを to にマップし、通常はテストなしで単一の式を記述できることを意味します。#to_a
[].
nil
[]