2016-07-21 2 views

답변

14

F #의 for .. in은 C#의 foreach 루프와 동일하지만 C#의 for 루프가 아닙니다. 그리고 C# 5 이후에 foreach 루프는 이 아니며 이터레이터를 업데이트합니다. . 당신이

for txt in ["abc"; "def"; "ghi"] do 
    printfn "%s" txt 

를 작성하는 경우 다음 당신은 실제로 세 가지를 만드는 : 그것은 대신 루프를 통해 각 반복에 대한 새로운 변수 (이 폐쇄에 대한 중요한 의미를 가지고 생성 자세한 내용은 Foreach now captures variables! (Access to modified closure) 참조이 F 번호가하는 일 또한 새로운 문자열 변수 당신은 그 루프를 실행하지 않을 때 하나의

이 F 번호가 새로운 변수를 매번 생성되는 다음-매우-작동하지 코드하려고 자신에게 증명하기 위해 :.

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() 

txt이 매번 for .. in 루프를 통해 같은 변수를 사용하는 경우 C# 4 이전과 마찬가지로 익명 함수가 변수를 닫고 루프 뒤에 변수 ghi이 포함되어 있기 때문에 ghi ghi ghi이 인쇄됩니다. 그러나 위의 코드를 실행하면 C# 5 이상에서 abc def ghi을 인쇄하는 것을 볼 수 있습니다.

귀하의 질문에 대한 답변은 이 실제로으로 변이되지 않기 때문에 F #이 폐쇄에서 for .. in을 허용한다는 것입니다.

+1

좋은 답변, 고맙습니다. – aikixd

관련 문제