如何在Ruby中测试三维哈希值的存在

时间:2014-08-25 07:36:30

标签: ruby

我有一个哈希变量,它可以以两种方式存在:像

这样的一维哈希
myvar['level1']

始终存在,或者像

这样的三维散列
myvar['level1']['level2']['level3']

可能存在也可能不存在。 level2成员可能在那里,有时与其他成员。现在,如果我想测试level3成员是否存在,我使用像

这样的代码
if myvar['level1']['level2'] != nil?
   if myvar['level1']['level2']['level3'] != nil?
      ....

因为我在访问level3成员时会收到错误,并且没有level2成员。我想知道是否有办法测试level3成员的存在而不先测试第二个成员?

2 个答案:

答案 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']
...