2016-07-21 10 views

Antwort

14

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.

+1

Große Antwort, danke. – aikixd