测试Ruby多维哈希

时间:2012-06-15 19:00:50

标签: ruby

  

可能重复:
  Is there a clean way to avoid calling a method on nil in a nested params hash?

是否有一种简单的方法可以检查多维散列中的值是否设置而不捕获NoMethodException?

例:

do_x if cat['level1']['level2']['level3'] != 'value'

问题是,'level2'可能甚至不存在,所以接收器是零。

在PHP中,你可以在前面放一个'@'来抑制错误。

在Ruby中,我必须将检查包装在一个开始 - 救援块中。

有像PHP这样的快速解决方案吗?

4 个答案:

答案 0 :(得分:1)

do_x if cat['level1']['level2']['level3'] != 'value' rescue nil

这是内联rescue。问题是,它可以隐藏错误,因为它从任何 RuntimeError中解救出来。您确实应该使用正确的begin - rescue块:

begin
  do_x if cat['level1']['level2']['level3'] != 'value'
rescue NoMethodError => error
  puts error.message
end

话虽如此,为什么不消除嵌套并完全避免这个问题?

do_x if cat['level1.level2.level3'] != 'value'

答案 1 :(得分:0)

你可以在nil上重新定义[],以便在运行代码之前它的行为与你想要的一样:

class NilClass
  def[](key)
    nil
  end
end

答案 2 :(得分:0)

class MyHash < Hash
  def initialize(levels=0)
    super()
    self.default = MyHash.new(levels-1) if levels > 1
  end
end

cat = MyHash.new(3)

cat['level1']                     #=> {}
cat['level1']['level2']           #=> {}
cat['level1']['level2']['level3'] #=> nil

答案 3 :(得分:0)

我会使用try方法而不是救援方法。 do_x if cat['level1'].try(:[], 'level2').try(:[], 'level3')因此,如果do_x引发异常,则不会获救,您实际上会看到do_x内部是否出现问题

相关问题