闭包中不允许使用可变值,但for .. in
表达式可以。在C#中,for循环更新迭代器,但在F#中似乎没有更新。如何以及为什么?
F#for .. in
等效于C#的foreach
循环,而不是C#的for
循环。而且,由于C#5,foreach
循环就不会更新迭代器; 相反,它为循环中的每次迭代创建一个新变量(这对闭包具有重要意义;有关详细信息,请参见Foreach现在捕获变量!(访问修改后的闭包)。这也是F#的作用:如果您编写
for txt in ["abc"; "def"; "ghi"] do
printfn "%s" txt
那么当您运行该循环时,实际上是在创建三个新的字符串变量,而不仅仅是一个。
为了向自己证明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
循环都使用相同的变量,则将进行打印ghi ghi ghi
,就像C#4和更早版本一样-因为匿名函数在变量之后关闭了变量,并且在循环之后包含ghi
。但是,如果运行上面的代码,您会看到它可以打印abc def ghi
,就像C#5和更高版本一样。
因此,您的问题的答案是F#允许for .. in
使用闭包,因为它实际上并未对任何内容进行突变。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句