Skala -Match -Zerlegung des Infixbetreibers
-
06-07-2019 - |
Frage
Ich versuche die Implementierung von zu verstehen List
s in Scala. Insbesondere versuche ich, mich mit einem Infix -Operator mit dem Übereinstimmungsausdruck zu machen, beispielsweise mit einem Infix -Operator:
a match {
case Nil => "An empty list"
case x :: Nil => "A list without a tail"
case x :: xs => "A list with a tail"
}
Wie darf der Match -Ausdruck sein x :: xs
statt List(x, xs)
?
Lösung
Jay Conrads Antwort ist fast richtig. Das Wichtigste ist, dass das irgendwo Es gibt ein Objekt benannt ::
das implementiert die unapply
Methode, zurückgegebener Typ Option[(A, List[A])]
. So:
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]
Im Falle des ::
und List
, Dieses Objekt kommt zufällig aus der Tatsache heraus, dass ::
ist eine Fallklasse, die die erweitert List
Merkmal. Wie das obige Beispiel zeigt, nicht haben überhaupt eine Fallklasse sein.
Andere Tipps
Ich glaube :: ist eigentlich eine Klasse (Welches ist eine Unterklasse der Liste), also sagen x :: xs
ist meistens gleichwertig zu List(x, xs)
.
Sie können dies mit anderen Fallklassen mit Bedienungsnamen tun. Zum Beispiel:
case class %%%(x: Int, y: Int)
a match {
case x %%% y => x + y
}
Wie darf der Match -Ausdruck X :: XS anstelle von Liste (x, xs) sein?
Um diese Frage zu beantworten:
Wenn als ein gesehen Muster, ein Infixbetrieb wie z. p op q ist äquivalent zu op (p, q). Das heißt, der Infix -Operator OP wird als a behandelt Konstruktormuster.
(Programmierung in Scala, 1. Aufl., S. 331)
Siehe auch Scala -Fallklassen Fragen