Ich verstehe nicht, warum die Autoren sagten, dass Code Listing 9.1 von "Programming in Scala" den Abschluss verwendet. In Kapitel 9 zeigen sie, wie Code aus diesem ursprünglichen Code in eine weniger duplizierte Form umgeformt wird:
%Vor%Zur zweiten Version:
%Vor%Sie sagten, dass hier kein Verschluss gebraucht wird. Jetzt verstehe ich bis zu diesem Punkt. Sie haben jedoch die Verwendung von closure eingeführt, um noch mehr zu refaktorisieren, wie in Listing 9.1 gezeigt:
%Vor%Jetzt sagten sie, dass query eine freie Variable ist, aber ich verstehe nicht wirklich, warum sie das gesagt haben? Seit "" Abfrage "" scheint von der Top-Methode bis String-Matching-Funktion explizit übergeben werden.
Sehen wir uns den klassischen Add-n-Abschluss von Was ist eine Schließung an.
%Vor% Im obigen Lambda-Ausdruck ist a
die freie Variable , die im Wikipedia-Link definiert ist :
eine Variable, auf die in einer Funktion Bezug genommen wird das ist keine lokale Variable oder ein Argument dieser Funktion. Ein Mehrwert ist eine freie Variable, die gebunden wurde (geschlossen) mit einem Verschluss.
Zurück zu
%Vor% Die implizite Funktion x => x.endsWith(query)
ist die First-Class-Funktion, die dem erstklassigen Wert matcher
zugeordnet ist, und _.endsWith()
wird über query
geschlossen, ähnlich wie 3% a
schließt %Code%. (add 3)
äquivalent wird von (add3 4)
erledigt.
Bearbeiten : Tricky Teil ist die Funktion in Scala namens Platzhalter-Syntax anonyme Funktionen. Indem Sie matcher(file.getName)
anstelle des Absenders oder des Parameters verwenden, erstellt Scala automatisch eine anonyme Funktion, die wir als Lambda-Ausdruck betrachten können.
Zum Beispiel
%Vor% Innerhalb der Funktion _
erfüllt x => x.endsWith(query)
die beiden Anforderungen, eine freie Variable zu sein:
query
ist keine lokale Variable, die in der Funktion definiert ist (es gibt keine lokale Variable). query
ist kein Argument der Funktion (das einzige Argument ist query
).