返回子子阵列而不检查nil

时间:2014-05-04 03:45:13

标签: ruby arrays hash

我使用下面代码的各种版本来查找哈希数组中的特定条目,然后返回不同的哈希值或子数组。使用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),是否有办法不解决程序错误?

有没有办法检查是否存在子子数组条目,然后执行任何赋值操作?

2 个答案:

答案 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_hh,如果a为数组,则a.to_aa。您可以使用它来隐藏nil

value = ary.find {|r| r["rail"][0] == lookup_rail}.to_h["id"].to_a[0]