Was bedeutet _ :: in Scala?

7

Ich gehe durch ein Buch Lift in action und begegne etwas, das ich nicht ganz verstehe: _ ::

%Vor%

Ich kann keinen Hinweis finden, also wäre ich dankbar, wenn mir jemand helfen könnte.

    
Jarek 10.01.2012, 18:33
quelle

3 Antworten

18

Ich kenne Lift nicht, aber das ist eine allgemeine Frage. Zuallererst ist die :: ein Scala Cons-Operator:

%Vor%

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.

    
Tomasz Nurkiewicz 10.01.2012, 18:42
quelle
5

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:)

    
Joachim Isaksson 10.01.2012 18:44
quelle
0

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

%Vor%

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.

    
Ramses 11.01.2012 10:48
quelle

Tags und Links