Скалярное логическое выражение может быть упрощено

Scalastyle (intellij 2016.1 по умолчанию) говорит, что это логическое выражение может быть упрощено

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

Я могу избавиться от этого, изменив if на:

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

Или изменив && на &

Но не понимая, как это упрощает, кто-нибудь может объяснить, что происходит?

Обновление Это не связано с тем, известны ли значения во время компиляции или они определены локально. Следующий код также получает предупреждение о том, что выражение может быть упрощено:

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))
}

Я просто не понимаю, как я должен сделать это проще, есть какой-то странный Option[Boolean], по которому я упускаю?

2 ответа

Решение

Похоже, что вы согласны с использованием вызова метода. Либо все в инфиксной форме:

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

Или все в обычной форме вызова метода:

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

С вашими ценностями, t.contains(true).&&(f.contains(false)) всегда возвращается true, Таким образом, вы можете упростить это, просто написав trueт.е. просто выполняя print без if состояние.

Другие вопросы по тегам