Ich habe zwei Fragen bezüglich der '::' Fallklasse.
:: kann als
verwendet werden %Vor%Wie funktioniert es? Was ist genau der Ablauf, den Scala verwendet, um eine List-Instanz mit der :: case-Klasse abzugleichen? Da ich eine Klasse MyClass mit operator op habe, kann ich eine Case-Klasse mit dem Namen op erstellen, die ich wie folgt verwenden kann:
%Vor%?
Es ist detailliert auf Seite 301 von Programmierung in Scala , Über Mustervergleich auf List
s.
Das "cons" -Muster
x :: xs
ist ein Spezialfall eines Infixes Betriebsmuster. Das weißt du bereits, wenn du es als Ausdruck siehst, Eine Infix-Operation entspricht einem Methodenaufruf. Für Muster die Regeln sind unterschiedlich: Wenn sie als Muster betrachtet werden, wird ein Infix-Vorgang wiep op q
entsprichtop(p, q)
. Das heißt, der Infix-Operatorop
wird als Konstruktormuster behandelt. Insbesondere wird ein Betrugsmuster wiex :: xs
als::(x, xs)
behandelt. Dies deutet darauf hin, dass es eine Klasse namens::
geben sollte, die dem Muster entspricht Konstrukteur. Tatsächlich gibt es eine solche Klasse. Es heißtscala.::
und ist genau die Klasse, die nicht leere Listen erstellt.
Tatsächlich ist die Tatsache, dass :: eine Fallklasse ist, nur die Hälfte der Antwort. Der Grund dafür ist, dass es einen Extraktor für object :: gibt, der automatisch generiert wird, wenn eine Fallklasse definiert wird. Praktischerweise gibt ::. Unapply eine List zurück, weil :: List erweitert. Wenn Sie denselben Trick für Listen verwenden möchten, können Sie List jedoch nicht erweitern, da es final ist. Was Sie tun können, ist ein Objekt mit der entsprechenden Nichtanwendungsmethode zu definieren, die die erwartete Rücksignatur aufweist. Um beispielsweise das letzte Element einer Liste zu vergleichen, können Sie Folgendes tun:
%Vor%Der Extraktor muss eine Option zurückgeben, die ein Tupel der beiden dekonstruierten Elemente enthält.
Der von eed3si9n zitierte Text steht auf p. 331 in der PDF-Ausgabe von "Programming in Scala" (1. Aufl.)