これには多くのアプローチがあります。あなたはルビー2.3以上を使用する場合
、あなたは平野ルビーとチェーン&&
ガード・テストにこだわる人々のdig
my_hash.dig('key1', 'key2', 'key3')
プレンティを使用することができます。
あなたもSTDLIB Hash#fetchを使用することができます。
my_hash.fetch('key1', {}).fetch('key2', {}).fetch('key3', nil)
一部activesupportのの#tryメソッドをチェーンのように。
my_hash.try(:[], 'key1').try(:[], 'key2').try(:[], 'key3')
その他andand
myhash['key1'].andand['key2'].andand['key3']
を使用する一部の人々はegocentric nilsは(誰かがあなたを追い詰めると、彼らはあなたがこれを行う見つかった場合は、あなたを苦しめるかもしれませんが)良いアイデアだと思います。
class NilClass
def method_missing(*args); nil; end
end
my_hash['key1']['key2']['key3']
Enumerable#reduce(またはエイリアスインジェクション)を使用できます。
['key1','key2','key3'].reduce(my_hash) {|m,k| m && m[k] }
それとも、ネストされたルックアップ法でハッシュまたはちょうどあなたのターゲットハッシュオブジェクトを拡張
module NestedHashLookup
def nest *keys
keys.reduce(self) {|m,k| m && m[k] }
end
end
my_hash.extend(NestedHashLookup)
my_hash.nest 'key1', 'key2', 'key3'
ああ、どのように我々はmaybeモナドを忘れることができますか?
Maybe.new(my_hash)['key1']['key2']['key3']
すみません。私はこれを探してみて、それを見つけることができませんでした。適切な場合は閉じてください。 – Nobita
受け入れられた答えには、Ruby 2.3+の正しい方法以外のすべての可能な方法が記載されています。http://ruby-doc.org/core-2.3.1/Hash.html#method-i-dig –