为什么“ for .. in”允许闭包?

合气道

闭包中不允许使用可变值,但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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么“ for .. in”允许闭包?

来自分类Dev

为什么Elixir允许使用未定义变量的闭包?

来自分类Dev

闭包-为什么这行代码是这样的?

来自分类Dev

闭包-为什么这行代码是这样的?

来自分类Dev

为什么允许通过原型继承访问另一个闭包范围内的私有变量?

来自分类Dev

为什么Python无法在闭包中增加变量?

来自分类Dev

与闭包混淆,为什么返回不正确的值

来自分类Dev

为什么F#闭包可序列化?

来自分类Dev

为什么要在代码中考虑使用JavaScript闭包?

来自分类Dev

JavaScript-为什么此闭包不保存参数?

来自分类Dev

Groovy:为什么闭包本身不能访问?

来自分类Dev

为什么这个javascript闭包无法正常运行?

来自分类Dev

为什么不能将变量移出闭包?

来自分类Dev

为什么对闭包应用lapply会出错?

来自分类Dev

为什么不能修改内联方法的闭包参数?

来自分类Dev

为什么clearTimeout不关闭闭包内的超时

来自分类Dev

为什么要在javascript闭包中打印此值?

来自分类Dev

为什么要在代码中考虑使用JavaScript闭包?

来自分类Dev

为什么F#闭包可序列化?

来自分类Dev

在此代码中,为什么要使用闭包?

来自分类Dev

为什么闭包编译器更改了“ this”?

来自分类Dev

React js:为什么我无法创建闭包?

来自分类Dev

JavaScript-为什么此闭包不保存参数?

来自分类Dev

为什么此代码的行为类似于闭包?

来自分类Dev

为什么我的闭包功能不起作用?

来自分类Dev

为什么Apple的闭包声明缺少参数标签

来自分类Dev

为什么这种闭包没有我期望的论点?

来自分类Dev

为什么在闭包 Laravel 中未定义变量?

来自分类Dev

为什么此defun闭包与defparameter闭包的行为不同?

Related 相关文章

热门标签

归档