使用::
模式匹配列表:
val ::(a, tail) = List(1,2,3)
// a: Int = 1
// tail: List[Int] = List(2, 3)
但是List
:
val List(a, tail) = List(1,2,3)
// match error
我试图找出为什么后者无法匹配,但没有幸运。
我在abstract class SeqFactory
中看到,有unapplySeq
方法:
def unapplySeq[A](x: CC[A]): Some[CC[A]] = Some(x)
但当x
为List[Int]
时,返回值仍为Some[List[Int]]
,我无法找到魔法的位置
答案 0 :(得分:3)
原因很简单。
List(1,2,3)
是包含3个元素的列表:[1,2,3]
,类似地List(head, tail)
是包含2个元素的列表:[head, tail]
。它是不但不是头部和它的尾巴。
scala> val hd :: tl = List(1,2,3) // val hd :: tl works the same as ::(hd, tl)
hd: Int = 1
tl: List[Int] = List(2,3)
scala> val List(a,b,c) = List(1,2,3)
a: Int = 1
b: Int = 2
c: Int = 3
因此,当您想使用List
取消应用列表时,您需要匹配所述列表中的确切项目数。否则,请使用更具历史性的::
运算符来获取头部和尾部