Scala - Verschlüsse
EIN closure ist eine Funktion, deren Rückgabewert vom Wert einer oder mehrerer außerhalb dieser Funktion deklarierter Variablen abhängt.
Der folgende Code mit anonymer Funktion.
val multiplier = (i:Int) => i * 10
Hier ist die einzige im Funktionskörper verwendete Variable i * 10 i, die als Parameter für die Funktion definiert ist. Versuchen Sie den folgenden Code -
val multiplier = (i:Int) => i * factor
Es gibt zwei freie Variablen im Multiplikator: i und factor. Einer von ihnen, i, ist ein formaler Parameter für die Funktion. Daher wird es bei jedem Aufruf des Multiplikators an einen neuen Wert gebunden. Jedoch,factorist kein formaler Parameter, was ist das dann? Fügen wir noch eine Codezeile hinzu.
var factor = 3
val multiplier = (i:Int) => i * factor
Jetzt factorhat einen Verweis auf eine Variable außerhalb der Funktion, jedoch im umschließenden Bereich. Die Funktionsreferenzenfactorund liest jedes Mal seinen aktuellen Wert. Wenn eine Funktion keine externen Referenzen hat, wird sie trivial über sich selbst geschlossen. Es ist kein externer Kontext erforderlich.
Versuchen Sie das folgende Beispielprogramm.
Beispiel
object Demo {
def main(args: Array[String]) {
println( "multiplier(1) value = " + multiplier(1) )
println( "multiplier(2) value = " + multiplier(2) )
}
var factor = 3
val multiplier = (i:Int) => i * factor
}
Speichern Sie das obige Programm in Demo.scala. Die folgenden Befehle werden zum Kompilieren und Ausführen dieses Programms verwendet.
Befehl
\>scalac Demo.scala
\>scala Demo
Ausgabe
multiplier(1) value = 3
multiplier(2) value = 6