Frage zu Scala Closure (aus "Programmierung in Scala")

8

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.

    
Ekkmanz 05.07.2009, 04:47
quelle

1 Antwort

17

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:

  1. query ist keine lokale Variable, die in der Funktion definiert ist (es gibt keine lokale Variable).
  2. query ist kein Argument der Funktion (das einzige Argument ist query ).
Eugene Yokota 05.07.2009, 05:16
quelle

Tags und Links