我需要检查属性的嵌套哈希
empty = if @body &&
@body["#{@path}_response".to_sym] &&
@body["#{@path}_response".to_sym]["#{@path}_result".to_sym] &&
@body["#{@path}_response".to_sym]["#{@path}_result".to_sym][:error][:error_code].eql?'NoAvailibilitiesFound'
true
else
false
end
我要检查的实际属性是:错误。但有可能
@body["#{@path}_response".to_sym]
甚至不存在。所以我在每个级别检查属性
这看起来有些奇怪。是否有优雅的红宝石'如何更好地做到这一点?
答案 0 :(得分:2)
我同意@Paul你应该使用Hash#fetch。保罗提到使用默认值,但认为它可能过于复杂。实际上,它非常简单:只需将默认值设为空哈希,如下所示:
h = { a: { b: {c: 1} } } #=> {:a=>{:b=>{:c=>1}}}
h.fetch(:a, {}).fetch(:b, {}).fetch(:c, false) #=> 1
h.fetch(:a, {}).fetch(:b, {}).fetch(:d, false) #=> false
h.fetch(:a, {}).fetch(:d, {}).fetch(:c, false) #=> false
h.fetch(:d, {}).fetch(:b, {}).fetch(:c, false) #=> false
此处我假设如果1
,:a
和:b
各个关键字出现,则会返回:c
;其他false
将被退回。
答案 1 :(得分:1)
可能有几种方法可以做到这一点,但我现在能想到的唯一选择是Hash#fetch
方法。根据文件:
从给定键的哈希值返回一个值。如果钥匙不能 发现,有几种选择:没有其他参数,它会 引发KeyError异常;如果给出了默认值,那么就是 回;如果指定了可选代码块,那么就是 运行并返回其结果。
因为看起来你需要知道:error_code
的值是否等于某个值,如果不是(或者结构不同),则需要知道,我相信你可以使用{{1如果抛出异常,则返回false,如下所示:
KeyError
您还可以使用文档中描述的“默认值”选项。然而,刚刚试图给你写一个例子,我意识到它会变得非常混乱,几乎不可能轻易阅读。
就像我说的那样,可能还有很多其他方法,但希望这已经足够了。如果这是有道理的,请告诉我。