有很多方法可以解决这个问题。
如果你使用 Ruby 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']
有些人认为以自我为中心的 nil是个好主意(尽管如果他们发现你这样做,有人可能会追捕你并折磨你)。
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] }
或者可能使用嵌套查找方法扩展 Hash 或只是您的目标哈希对象
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.new(my_hash)['key1']['key2']['key3']