我正在尝试以下代码:
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 {
如果我使用true
和false
而不是TRUE_BOOLEAN
和FALSE_BOOLEAN
,则不会收到任何警告。
set1.contains(4) match {
case true => println("Element found")
case false => println("Element not found")
}
有人可以解释此警告的原因以及为什么true
和false
消失了。
答案 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
编译正常,没有警告。