如何查看多维哈希值是否在ruby中具有值?

目前我正在做以下事情,但我确信必须有更好的方法:

def birthday_defined?(map)
    map && map[:extra] && map[:extra][:raw_info] && map[:extra][:raw_info][:birthday]
end

可能存在仅定义map [:extra]的情况,然后我将最终得到Nil异常错误导致map [:extra] [:raw_info]如果我不使用上面检查的代码则不存在.

最佳答案 如果您正在使用Rails,那么您可以使用
try(和
NilClass#try):

value = map.try(:[], :extra).try(:[], :raw_info).try(:[], :birthday)

这看起来有点重复:它只是一遍又一遍地做同样的事情,同时将一步的结果输入下一步.该代码模式意味着我们有一个隐藏的注入:

value = [:extra, :raw_info, :birthday].inject(map) { |h, k| h.try(:[], k) }

这种方法很好地概括了你想到的任何到地图的路径:

path  = [ :some, :path, :of, :keys, :we, :care, :about ]
value = path.inject(map) { |h, k| h.try(:[], k) }

然后你可以看看value.nil?.

当然,如果您不使用Rails,那么您需要替换尝试,但这并不困难.

点赞