Veränderbare Werte sind in Verschlüssen nicht zulässig, aber der Ausdruck for .. in
ist in Ordnung. In C# aktualisiert die for-Schleife den Iterator, aber nicht in F #, wie es scheint. Wie und warum?Warum 'for .. in' in Schließungen erlaubt?
Antwort
F # 's for .. in
entspricht C# foreach
Schleife, nicht C#' s for
Schleife. Und da C# 5, die foreach
Schleife nicht aktualisiert den Iterator; . Es stattdessen eine neue Variable für jede Iteration durch die Schleife erzeugt (dies wichtige Auswirkungen auf die Verschlüsse hat, siehe Foreach now captures variables! (Access to modified closure) Einzelheiten Das ist auch das, was F # tut: wenn Sie
for txt in ["abc"; "def"; "ghi"] do
printfn "%s" txt
schreiben dann bist du eigentlich drei Erstellen neue String-Variablen, wenn Sie laufen, dass die Schleife, nicht nur ein
zu dir selbst zu beweisen, dass F # einer neuen Variable jedes Mal schafft, versuchen Sie den folgenden nicht-sehr-Funktionscode.
let actions = new System.Collections.Generic.List<System.Action<unit>>()
for txt in ["abc"; "def"; "ghi"] do
actions.Add(fun() -> printf "%s " txt)
for action in actions do
action.Invoke()
Wenn txt
war die gleiche Variable jedes Mal durch die for .. in
Schleife, würde dies Drucken ghi ghi ghi
, genau wie C# 4 und früher hätte - weil die anonyme Funktion über die Variable geschlossen, und nach der Schleife enthält die Variable ghi
. Aber wenn Sie den obigen Code ausführen, werden Sie sehen, dass es abc def ghi
, wie C# 5 und später, druckt.
So ist die Antwort auf Ihre Frage ist, dass F # for .. in
in einem Verschluss erlaubt es, weil es nicht wirklich etwas mutiert.
Große Antwort, danke. – aikixd