如何最小化嵌套的if语句? (红宝石)

时间:2012-07-09 20:23:20

标签: ruby

我发现我经常在Ruby代码中做这类事情:

if person
  if person.shirt
    if person.shirt.sleeve
    ...
  end
end

..我这样做是为了避免NoMethodErrors。我想知道是否有任何方法可以将其折叠成一行,没有明显的

if person && person.shirt && person.shirt.sleeve

基本上,我想让我的代码更紧凑。

1 个答案:

答案 0 :(得分:6)

在那些ifs中,你想用袖子做点什么,对吧?

Rails有一个很好的帮助,try。如果一切顺利,它会返回值,否则为nil。因此,在此示例中,如果person.shirt或甚至person本身为零,则尝试也将返回nil。

if sleeve = person.try(:shirt).try(:sleeve)
  # do your stuff
end

对于vanilla ruby​​,您可以使用提供类似功能的andand gem。

if sleeve = person.andand.shirt.andand.sleeve
  # do your stuff
end

从ruby 2.3开始,您可以使用安全导航操作符:

if sleeve = person&.shirt&.sleeve
  # do your stuff
end