90

重複の可能性:
Ruby: IF ステートメントの
Nils

次のようなハッシュにアクセスしようとするとします。

my_hash['key1']['key2']['key3']

これは、キー 1、キー 2、およびキー 3 がハッシュに存在する場合に便利ですが、たとえばキー 1 が存在しない場合はどうでしょうか。

それから私は得るでしょうNoMethodError: undefined method [] for nil:NilClass。そして、誰もそれを好きではありません。

これまでのところ、次のような条件付きでこれに対処しています。

if my_hash['key1'] && my_hash['key1']['key2']...

これは適切ですか?他の Rubyest の方法はありますか?

4

3 に答える 3

5

コンディションはDRYmy_hash['key1'] && my_hash['key1']['key2']ではありません。

代替案:

1)自動蘇生魔法。その投稿から:

def autovivifying_hash
   Hash.new {|ht,k| ht[k] = autovivifying_hash}
end

次に、あなたの例で:

my_hash = autovivifying_hash     
my_hash['key1']['key2']['key3']

どちらもデフォルト値として新しいハッシュで動作するという点で Hash.fetch アプローチに似ていますが、これは詳細を作成時に移動します。確かに、これはちょっとしたごまかしです。オンザフライで作成された空のハッシュだけを返すことは決してありません。ユースケースによっては、これは無駄になる可能性があります。

2) ルックアップ メカニズムを使用してデータ構造を抽象化し、見つからないケースを舞台裏で処理します。簡単な例:

def lookup(model, key, *rest) 
    v = model[key]
    if rest.empty?
       v
    else
       v && lookup(v, *rest)
    end
end
#####

lookup(my_hash, 'key1', 'key2', 'key3')
=> nil or value

3)モナドだと感じたら、これを見てください 。

于 2012-04-12T19:58:42.963 に答える