例如,
List(1, 2, 3) match {
case x :: y => (x, y)
}
在上面的代码中,模式匹配将自动发现任何非空 List
与案例 x :: y
匹配 . 我想知道,为什么会这样?
众所周知, List
类中有一个 ::
方法 . 另外,我发现在"list.scala"中有一个 ::
案例类:
/** A non empty list characterized by a head and a tail.
* @param head the first element of the list
* @param tl the list containing the remaining elements of this list after the first one.
* @tparam B the type of the list elements.
* @author Martin Odersky
* @version 1.0, 15/07/2003
* @since 2.8
*/
@SerialVersionUID(509929039250432923L) // value computed by serialver for 2.11.2, annotation added in 2.11.4
final case class ::[B](override val head: B, private[scala] var tl: List[B]) extends List[B] {
override def tail : List[B] = tl
override def isEmpty: Boolean = false
}
因此,我们可以编写 ::(1, Nil)
来构造一个新的 List
. 更重要的是,使用Scala中的中缀符号,我们能够等效地编写 1 :: Nil
(虽然事实证明 Nil.::(1)
将被调用而不是 ::(1, Nil)
,可能是由于某些优先规则 . )
因此,我猜案例类 ::
与 ::
的模式匹配有关(例如,模式 x :: y
将匹配 ::.unapply
之类的东西) . 但我没有为案例类 ::
找到任何 unapply
方法或伴随对象 .
谁能告诉我我的猜测是否正确?如果没有,在Scala中如何实现 ::
的模式匹配?
谢谢!
EDIT:
显然,case类为 ::
, ::.unapply
将自动为 ::
生成 . 因此,我可以理解 case x :: y
将匹配 ::
的实例(例如:::(1,2)) . 但众所周知, case x :: y
也匹配 List
类型的所有实例,这是 ::
的基类 . 因此,我认为可能有一些特殊的 unapply
是我猜的正确 .
1 回答
它被称为构造函数模式:
http://www.scala-lang.org/files/archive/spec/2.11/08-pattern-matching.html#constructor-patterns
类型(
::
)只需符合模式类型(List
),然后"arg"模式必须匹配 .它看起来类似于提取器模式,但是不同 .
编辑显示外观ma,没有提取器:
非空List必须是
::
类型 . 这就是它在构造函数模式中测试的内容 . 空列表Nil
不是 .