警告匹配可能并不详尽

时间:2018-12-19 17:29:45

标签: scala pattern-matching

我正在尝试以下代码:

  val set1 = Set(1,2,3,4,5,67,8)
  val TRUE_BOOLEAN = true
  val FALSE_BOOLEAN = false
  set1.contains(4) match {
    case TRUE_BOOLEAN => println("Element found")
    case FALSE_BOOLEAN => println("Element not found")
  }

但是,当我尝试在IntelliJ中运行它时,它在Messages标签中给出了以下警告:

Warning:(11, 16) match may not be exhaustive.
It would fail on the following inputs: false, true
  set1.contains(4) match {

如果我使用truefalse而不是TRUE_BOOLEANFALSE_BOOLEAN,则不会收到任何警告。

set1.contains(4) match {
    case true => println("Element found")
    case false => println("Element not found")
  }

有人可以解释此警告的原因以及为什么truefalse消失了。

1 个答案:

答案 0 :(得分:11)

它会产生警告,因为它不能保证匹配完全。

实际上,当嵌入正确的上下文中时,您的代码会在运行时引发匹配错误:

beforeRouteLeave(to, from, next) {
  $('body').css('overflow', 'auto');

  next()
}

因此警告是正确,而不仅仅是保守的估计。由于每个Scala脚本都隐式地嵌入到某些“类”包装器中,因此即使您不将其包装在class Foo { val set1 = Set(1,2,3,4,5,67,8) val TRUE_BOOLEAN = true val FALSE_BOOLEAN = false set1.contains(4) match { case TRUE_BOOLEAN => println("Element found") case FALSE_BOOLEAN => println("Element not found") } } class Bar extends Foo { override val TRUE_BOOLEAN = false } new Bar // scala.MatchError: true (of class java.lang.Boolean) 类中,它也可以以完全相同的方式在Scala脚本中工作。

如果将两个变量都设置为Foo,则常量传播将正常工作,并且不会发出警告:

final

编译正常,没有警告。