我使用下面代码的各种版本来查找哈希数组中的特定条目,然后返回不同的哈希值或子数组。使用XMLSimple
导入XML时,这种多级数组/哈希结构很常见(例如,我无法控制数据结构的组织方式)。
如果发现无法找到结果,这将导致错误:
value = ary.find {|r| r["rail"][0] == lookup_rail}["id"][0]
这可以使用tap
,但是越来越多的子阵列和子主题变得更加丑陋。
ary.find {|r| r["rail"][0] == lookup_rail}.tap do |f|
value = f.nil? ? nil : (f["id"].nil? nil : f["id"][0])
end
如果我引用nil对象的子数组(不添加到NilClass
),是否有办法不解决程序错误?
有没有办法检查是否存在子子数组条目,然后执行任何赋值操作?
答案 0 :(得分:2)
如何使用&&
?
x = {"id" => ["train"]}
x && x["id"] && x["id"][0]
# => "train"
x = {"id" => nil}
x && x["id"] && x["id"][0]
# => nil
x = nil
x && x["id"] && x["id"][0]
# => nil
ary.find {|r| r["rail"][0] == lookup_rail}.tap do |f|
value = f && f["id"] && f["id"][0]
end
答案 1 :(得分:1)
在Ruby 2.0+中,nil.to_h
为{ }
;此外,只要我记得,nil.to_a
已[ ]
。当然,如果h
是哈希,则h.to_h
为h
,如果a
为数组,则a.to_a
为a
。您可以使用它来隐藏nil
:
value = ary.find {|r| r["rail"][0] == lookup_rail}.to_h["id"].to_a[0]