我有一个哈希变量,它可以以两种方式存在:像
这样的一维哈希myvar['level1']
始终存在,或者像
这样的三维散列myvar['level1']['level2']['level3']
可能存在也可能不存在。 level2成员可能在那里,有时与其他成员。现在,如果我想测试level3成员是否存在,我使用像
这样的代码if myvar['level1']['level2'] != nil?
if myvar['level1']['level2']['level3'] != nil?
....
因为我在访问level3成员时会收到错误,并且没有level2成员。我想知道是否有办法测试level3成员的存在而不先测试第二个成员?
答案 0 :(得分:2)
这是一种方式:
def extract_values(h,keys)
keys.reduce(h) { |g,k| ((g.is_a? Hash) ? g : {})[k] }
end
h = {a: {b: {c: "The End"} } }
extract_values(h,[]) #=> {:a=>{:b=>{:c=>"The End"}}}
extract_values(h,[:a]) #=> {:b=>{:c=>"The End"}}
extract_values(h,[:a, :b]) #=> {:c=>"The End"}
extract_values(h,[:a, :b, :c]) #=> "The End"
extract_values(h,[:a, :z, :c]) #=> nil
extract_values(h,[:a, :b, :c, :d]) #=> nil
答案 1 :(得分:0)
不,不可能。 " 3级"存在于" level2",因此必须先通过它。 您可以使测试看起来更好,但您需要测试" level2"第一。 我可以建议一个更好的版本,但它是很多
之一if l1 = mayvar['level1'] && l2 = l1['level2'] && l2['level3']
...