我发现我经常在Ruby代码中做这类事情:
if person
if person.shirt
if person.shirt.sleeve
...
end
end
..我这样做是为了避免NoMethodErrors
。我想知道是否有任何方法可以将其折叠成一行,没有明显的
if person && person.shirt && person.shirt.sleeve
基本上,我想让我的代码更紧凑。
答案 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