2016-03-29 69 views
5

Scalastyle(的IntelliJ 2016.1默认值)表示,这布尔表达式可以简化Scalastyle布尔表达式可以简化

val t = Option(true) 
val f = Option(false) 
if(t.contains(true) && f.contains(false)) { 
    println("booop") 
} 

我可以通过改变摆脱这个如果到:

if(t.contains(true).&&(f.contains(false))) 

或者通过改变& &改为&

但是不是真的看到这是如何简化它,任何人都可以解释ñ发生了什么事?

更新 它似乎没有关系,如果VAL是编译时已知的,或者它们是本地定义的。下面的代码也得是警告,该表达式可以simplfied:

object TestFoo { 
    def bar(t: Option[Boolean]) = { 
    val f = Option(scala.util.Random.nextBoolean) 
    if (t.contains(true) && f.contains(false)) println("booop") 
    } 
    def main(args: Array[String]) = bar(t = Option(scala.util.Random.nextBoolean)) 
} 

我只是不明白,我应该怎样做,任何简单,有一些奇怪的选项[布尔]比较我错过了?

+0

我觉得,既然你声明的值,并且仅使用它们那里,它希望你在网上这些值在你的'if'语句中 – hasumedic

+0

看起来不像变量被定义的地方,或者在编译时知道该值是重要的。用另一个示例更新 – klogd

+1

当您使用中缀表示法时会发生什么?例如'(t包含true)&&(f包含false)' – hasumedic

回答

2

它似乎暗示你与方法调用的使用一致。无论是一切都在缀形式:

(t contains true) && (f contains false) 

或者一切都在规则的方法调用形式:

t.contains(true).&&(f.contains(false)) 
1

随着您的值,t.contains(true).&&(f.contains(false))总是返回true。所以你可以通过简单地写true来简化它,即只需执行print而没有if条件。

+0

对不起,实际的代码不使用编译时已知的值。我已经添加了另一个例子来澄清 – klogd