以下代码:
let CreateFunc=
let counter = ref 0
fun () -> counter := !counter + 1; !counter
let f1 = CreateFunc
let f2 = CreateFunc
printfn "%d" (f1())
printfn "%d" (f1())
printfn "%d" (f2())
printfn "%d" (f2())
Run Code Online (Sandbox Code Playgroud)
输出:
1
2
3
4
Run Code Online (Sandbox Code Playgroud)
所以,基本上,我们在这里看到的是f1和f2是相同的功能 - 因为它们显然共享同一个'counter'实例.
预期的产出是:
1
2
1
2
Run Code Online (Sandbox Code Playgroud)
问题:f1和f2不应该是两个独立的实例吗?毕竟它们是由两个不同的'CreateFunc'调用创建的?
谢谢
let CreateFunc() =
let counter = ref 0
fun () -> counter := !counter + 1; !counter
let f1 = CreateFunc()
let f2 = CreateFunc()
printfn "%d" (f1())
printfn "%d" (f1())
printfn "%d" (f2())
printfn "%d" (f2())
Run Code Online (Sandbox Code Playgroud)
输出是
1
2
1
2
Run Code Online (Sandbox Code Playgroud)
说明:
在您的原始解决方案中,CreateFunc是一个函数,但始终是相同的函数(CreateFunc,f1并且f2都是同义词,都指向相同的函数).在我的解决方案中CreateFunc是一个函数,无论何时调用它都会返回一个新函数,因此每个函数都有自己的状态(即counter).
简而言之:原始CreateFunc值是一个值,总是相同的值.