我有一个包含大量嵌套Mashes的大型Mash对象。我想得到的一些数据是几层,如:
phone = profile.phone_numbers.all.first.phone_number
title = profile.positions.all.first.title
但是,phone_numbers或position可能是零或空。什么是最有效的零检查方式,而不必检查每个级别。是否有一般技术可供使用?
答案 0 :(得分:4)
Ick的maybe
可以帮助你!
像这样使用:
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