为什么scala编译器有时会在;“模式匹配”;,有时不是吗?
首先定义一个列表:为什么scala编译器有时会在;“模式匹配”;,有时不是吗?,scala,pattern-matching,Scala,Pattern Matching,首先定义一个列表: val list = List(1,2,3) Scala编译器给出警告(即使它可以匹配): Scala编译器不会给出警告(即使它不匹配): 我无法理解第二个只有当模式匹配是密封的类的类型,并且您只有子类或对象的子集时,才会给出“匹配可能不彻底”警告List是一个密封类,它有一个子类:和一个子对象Nil,类似于: sealed abstract class List[+T] class ::[+T] extends List[+T] object Nil extends Li
val list = List(1,2,3)
Scala编译器给出警告(即使它可以匹配):
Scala编译器不会给出警告(即使它不匹配):
我无法理解第二个只有当模式匹配是密封的
类的类型,并且您只有子类或对象的子集时,才会给出“匹配可能不彻底”警告List
是一个密封类,它有一个子类:
和一个子对象Nil
,类似于:
sealed abstract class List[+T]
class ::[+T] extends List[+T]
object Nil extends List[Nothing]
如果您有一个匹配项
,并且没有一个案例用于:
,一个案例用于无
,并且没有一个案例可能匹配任何列表
,Scala知道匹配项并不详尽,并将报告它。案例
将匹配任何内容并阻止警告。但是List(a,b)
也阻止了警告,因为Scala不知道它是否只匹配一些子类
当您使用List
作为提取器时,就像在List(a,b)
中一样,您正在使用提取器List.unplyseq
来分离匹配的值。Scala不尝试对提取器的行为进行假设,因此不知道匹配不是详尽无遗的。如果不知道List.unplyseq
的实现细节,就无法知道它不会很好地匹配所有内容并返回所需的两个值
list match {
case List(a,b) => println("!!!")
}
sealed abstract class List[+T]
class ::[+T] extends List[+T]
object Nil extends List[Nothing]