可能重复:
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这样的快速解决方案吗?
答案 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内部是否出现问题