检查多个变量的空值

5
很多变量需要一些处理,所以我在检查它们中是否有任何一个为 nil 。是否有更有效的编写以下代码的方法?
unless a.nil? || b.nil? || c.nil? || d.nil? || e.nil? || f.nil? || g.nil?
  render 'view'
end

我应该避免在一行上检查很多变量是否为nil吗?


false 是有效值还是和 nil 一样?如果 falsenil 一样,那么我可以直接省略 .nil? 方法调用(这样反而会降低性能)。即使其他代码看起来更好,我也怀疑任何东西都比 @Meier 的答案表现得更好...(除了 可能 省略 if,这样我们就可以得到 a && b && c && d && e && f && render('view'))。 - Myst
@Myst,抱歉我忘了提到一些变量是不能空的数组,所以根据@zetetic的答案,if [a,b,c,d,e,f,g].none{ |x| x.nil? || x.empty? } 是否是一个好的解决方案? - massaskillz
1
在Rails中,您还可以使用blank?方法,该方法可在NilClass、String和Array的实例上调用。因此,.none(&:blank?)可能是您要查找的内容。 - zetetic
也许您应该提出更详细的问题,说明您的需求或实际要解决的问题。对于带有nilfalse的数组(例如[1, nil][false, nil]),该怎么办?对于空哈希或nil哈希,该怎么办?对于空字符串呢?对于只有空格、换行等的字符串呢?falsenil呢?...另外,我不确定您要解决什么问题,但我认为不同的设计可能会帮助您避免使用这个庞大的if语句。 - Myst
@Myst,zetetic上面的评论就是我要找的。你的额外问题在我的情况下不适用。不过下次我会尽量添加更多具体信息,谢谢。 - massaskillz
我很高兴你找到了你要找的东西。请注意,blank?会对空格字符串返回true(例如:" \n\t".blank? == true)。 - Myst
5个回答

8
unless [a,b,c,d,e,f,g].include?(nil)
  render 'view'
end

8
通过使用none?,您可以用if代替unless
if [a,b,c,d,e,f,g].none?(&:nil?)

想一想,这可以简化为以下内容:
if [a,b,c,d,e,f,g].all?

如果你不介意把 false 看作与 nil 相同

有没有更高效的编写方式?

我认为更好的问题是,“是否有更加表达清晰的编写方式…”


3
render 'view' unless [a,b,c,d,e,f,g].any?(&:nil?)

另一种方法:
render 'view' if [a,b,c,d,e,f,g].index(nil)

2
如果你的 a,b,c... 是对象(或者是一个永远不会为false的东西),你可以这样写:
if a && b && c && d && e && f
    render 'view' 
end

2

另外还有一些其他的方法:

arr = [a,b,c,d,e,f,g]
render 'view' if arr.compact == arr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接