我发现我经常在我的 Ruby 代码中做这样的事情:
if person
if person.shirt
if person.shirt.sleeve
...
end
end
..我这样做是为了避免NoMethodErrors
。我想知道是否有任何方法可以将其折叠成一行,而没有明显的
if person && person.shirt && person.shirt.sleeve
基本上,我想让我的代码更紧凑。
我发现我经常在我的 Ruby 代码中做这样的事情:
if person
if person.shirt
if person.shirt.sleeve
...
end
end
..我这样做是为了避免NoMethodErrors
。我想知道是否有任何方法可以将其折叠成一行,而没有明显的
if person && person.shirt && person.shirt.sleeve
基本上,我想让我的代码更紧凑。
在那些假设中,您想用袖子做点什么,对吗?
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