这有许多方法。
如果你使用的是 Ruby 2.3 或以上版本,可以使用
dig。
my_hash.dig('key1', 'key2', 'key3')
许多人坚持使用简单的ruby并链接
&&
保护测试。
你也可以使用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']
有些人认为
自我中心的尼尔斯 是一个好主意(尽管如果有人发现你这样做,他们可能会追捕你并折磨你)。
class NilClass
def method_missing(*args); nil; end
end
my_hash['key1']['key2']['key3']
你可以使用
Enumerable#reduce(或别名inject)。
['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 monad呢?
Maybe.new(my_hash)['key1']['key2']['key3']