我正在尝试理解 Scala 中 List
的实现。特别是,我正在努力理解如何使用中缀运算符编写匹配表达式,例如:
a match {
case Nil => "An empty list"
case x :: Nil => "A list without a tail"
case x :: xs => "A list with a tail"
}
匹配表达式为什么可以写成x :: xs
而不是List(x, xs)
?
我正在尝试理解 Scala 中 List
的实现。特别是,我正在努力理解如何使用中缀运算符编写匹配表达式,例如:
a match {
case Nil => "An empty list"
case x :: Nil => "A list without a tail"
case x :: xs => "A list with a tail"
}
匹配表达式为什么可以写成x :: xs
而不是List(x, xs)
?
Jay Conrad的答案几乎是正确的。重要的是,在某个地方有一个名为::
的对象,它实现了unapply
方法,返回类型为Option[(A, List[A])]
。因此:
object :: {
def unapply[A](ls: List[A]): Option[(A, A)] = {
if (ls.empty) None
else Some((ls.head, ls.tail))
}
}
// case objects get unapply for free
case object Nil extends List[Nothing]
对于::
和List
而言,这个对象的出现是因为::
是一个扩展了List
特质的case class。然而,正如上面的例子所示,它并不一定非得是一个case class。
x :: xs
大多等同于 List(x, xs)
。case class %%%(x: Int, y: Int)
a match {
case x %%% y => x + y
}