1

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

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

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

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

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

4

1 回答 1

6

在那些假设中,您想用袖子做点什么,对吗?

Rails 有一个很好的助手,try. 如果一切顺利,它会返回值,nil否则。所以,在这个例子中,如果person.shirt甚至person它本身是 nil,try 也会返回 nil。

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

对于香草红宝石,您可以使用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
于 2012-07-09T20:26:51.077 回答