在嵌套哈希中检查nil的最有效方法是什么

时间:2012-01-01 05:18:29

标签: ruby

我有一个包含大量嵌套Mashes的大型Mash对象。我想得到的一些数据是几层,如:

phone = profile.phone_numbers.all.first.phone_number
title = profile.positions.all.first.title

但是,phone_numbers或position可能是零或空。什么是最有效的零检查方式,而不必检查每个级别。是否有一般技术可供使用?

2 个答案:

答案 0 :(得分:4)

Ickmaybe可以帮助你!

像这样使用:

phone = maybe(profile) {|p| p.phone_numbers.all.first.phone_number}

# or like this. 
phone = profile.maybe.phone_numbers.
                maybe.all.
                maybe.first.
                maybe.phone_number

或者您可以选择更简单的解决方案:Object#andand。它以类似的方式运作。

phone = profile.andand.phone_numbers.
                andand.all.
                andand.first.
                andand.phone_number

答案 1 :(得分:2)

要知道的重要一点是,如果中间值为零,您希望发生什么。您希望赋值为nil还是其他值?您是希望处理继续还是停止或引发错误?

如果可以接受分配nil,则可以在该行中添加rescue nil子句:

phone = profile.phone_numbers.all.first.phone_number rescue nil
title = profile.positions.all.first.title rescue nil

将返回nil,它将被分配给变量,处理将继续。这样做有一些风险,因为如果介入的方法或值是零,那么你可能对此有所了解。零值通常意味着在执行到达该点之前未正确分配某些内容,并且救援将使其变得模糊,使调试更加困难。

如果您想继续,但有机会在继续之前作出反应,请使用标准救援块:

begin
  phone = profile.phone_numbers.all.first.phone_number
rescue Exception => e
  STDERR.puts "Exception handled: #{ e }"
  phone = nil
end