Например,Как сопоставляется шаблон для :: реализованы?
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
или компаньона для класса case ::
.
Не мог бы кто-нибудь сказать мне, правильно ли мое предположение? Если нет, то как сопоставляется шаблон для ::
, реализованный в Scala?
Спасибо!
EDIT:
Очевидно, что случай класса, как ::
есть, ::.unapply
будет сгенерирован автоматически для ::
. Таким образом, я могу понять, что case x :: y
будет соответствовать экземпляру ::
(скажем,: :(1, 2)). Но, как мы все знаем, case x :: y
также соответствует всем экземплярам типа List
, который является базовым классом ::
. Таким образом, я думаю, что может быть какая-то особенная unapply
были мои предположения правильными.
'::. Unapply' существует, потому что' unapply' автоматически генерируется для классов case, которые '::' есть. –
Спасибо @ m-z, я могу понять, почему 'x :: y' будет соответствовать экземпляру класса' :: 'case. Но я не могу понять, почему он также совпадает с общим «списком», который является базовым классом класса case '::'. –
@mz, пожалуйста, исправьте меня, если я ошибаюсь, я думаю, что автоматически созданный 'D.unapply' соответствует только экземпляру' D', но не базовому классу D. –