Ich kenne Lift nicht, aber das ist eine allgemeine Frage. Zuallererst ist die ::
ein Scala Cons-Operator:
Dies bedeutet, dass super.validations
eine Art von Sequenz ist und valMinLen(3, "Link URL must be at least 5 characters") _
ein einzelner Wert in dieser Liste ist.
Aus dem Kontext sieht es offensichtlich aus, dass sie in der überschriebenen validations
-Methode super
version aufrufen und am Anfang eine zusätzliche Validierung voranstellen.
Diese zusätzliche Validierung wird durch einen Aufruf von valMinLen()
erstellt. Dieser zusätzliche Aufruf gibt jedoch kein Element zurück, das dem Typ von validations
list entspricht, sondern eine Funktion. Anstatt den Funktionswert voranzustellen, sagen wir explizit (indem wir _
suffix hinzufügen), dass wir eine Funktion selbst vorgeben wollen, nicht einen Rückgabewert dieser Funktion.
Code-Snippet sagt mehr als tausend Worte:
%Vor% Vergleichen Sie den Typ von listOfInts
und listOfFunctions
. Ich glaube, dass die f _
-Syntax in Scala World teilweise angewandte Funktion genannt wird.
Der Unterstrich weist darauf hin, dass valMinLen nicht aufgerufen, sondern als Funktion "Zeiger" verwendet werden soll.
Der Operator ::
verkettet Listen.
Es würde mit anderen Worten so aussehen, als ob der Code eine Liste validations
aufbaut, die aus einer Funktion "Zeiger" auf valMinLen
mit den angegebenen Parametern besteht und der Rest der Liste ist der Wert von super.validations
, das heißt die Validierungen der Superklasse.
Ich bin mir sicher, dass jemand meine Terminologie hier korrigieren wird:)
Der Code könnte besser lesbar sein, mit einem richtigen Einzug und einem val:
%Vor% Wie bereits erwähnt, fügt der Operator ::
nur ein neues Element einer Liste hinzu, das _
hat damit nichts zu tun und wird verwendet, um ein Funktionsobjekt zu erhalten, wie in
erstellt eine Liste [1, 2] und wendet die Funktion println auf jedes Element an (der Unterstrich kann hier eigentlich weggelassen werden). Das Objekt println _
konstruiert ein Funktionsobjekt aus der println
-Methode, wobei _
den einzigen Parameter der Funktion darstellt.