use*_*098 0 variables f# list-comprehension mutable
在列表comp.例如,变量是否使用了与let stmt中状态相同的实变量?如果是这样,它实际上是可变的,对吗?它每次都围绕循环被绑定到一个新的东西吧?
不,它不是一个可变的变量.我们可以通过创建稍后调用以打印它的函数来看到这一点.
注意:
let printIs = [for i in 1..10 do yield fun () -> printf "%i " i]
printIs |> List.iter (fun f -> f())
Run Code Online (Sandbox Code Playgroud)
返回:
Run Code Online (Sandbox Code Playgroud)1 2 3 4 5 6 7 8 9 10
请注意,每个1..10值都会打印出来,因此i
不能是一个可变变量,因为如果是,i
则10
在循环完成后始终具有该值.实际上,符号i
指的是列表理解中每一步的不同的不可变值.
如果我尝试用实际的可变变量来做这件事x
,我会得到不同的行为:
let mutable x = 1
let printIs2 =
[for i in 1..10 do
x <- i
yield fun () -> printf "%i " x]
printIs2 |> List.iter (fun f -> f())
Run Code Online (Sandbox Code Playgroud)
返回:
Run Code Online (Sandbox Code Playgroud)10 10 10 10 10 10 10 10 10 10