Fre*_*ind 2 scala pattern-matching
首先定义一个列表:
val list = List(1,2,3)
Run Code Online (Sandbox Code Playgroud)
Scala编译器发出警告(即使它可以匹配):
list match {
case head :: tail => println(s"h:${head} ~ t: ${tail}")
}
Run Code Online (Sandbox Code Playgroud)
Scala编译器不会发出警告(即使它不匹配):
list match {
case List(a,b) => println("!!!")
}
Run Code Online (Sandbox Code Playgroud)
我无法理解第二个
win*_*ner 11
"匹配可能不是详尽的"警告仅在类型类型上的模式匹配时给出,sealed并且只有子类或子对象的子集.List是一个带有子类::和子对象的密封类Nil,类似于:
sealed abstract class List[+T]
class ::[+T] extends List[+T]
object Nil extends List[Nothing]
Run Code Online (Sandbox Code Playgroud)
如果你有一个match并且没有一个for ::和一个for的情况Nil,并且也没有可能匹配任何一个的情况List,Scala知道匹配并不详尽并且会报告它.A case _会匹配任何东西,并会阻止警告.但是List(a, b)也会阻止警告,因为Scala不知道它是否只匹配某些子类.
当您List用作提取器时List(a, b),您正在使用提取器List.unapplySeq来拆分匹配的值.Scala不会尝试对提取器的行为进行假设,因此不知道匹配并非详尽无遗.在不知道实现细节的情况下List.unapplySeq,没有办法知道它不会愉快地匹配所有内容并返回所需的两个值.