目前我正在做以下事情,但我确信必须有更好的方法:
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,那么您需要替换尝试,但这并不困难.