以下代码:
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())
输出:
1
2
3
4
所以,基本上,我们在这里看到的是f1和f2是相同的功能 - 因为它们显然共享同一个'counter'实例。
预期输出为:
1
2
1
2
问题:f1和f2不应该是两个独立的实例吗?毕竟它们是由两个不同的“CreateFunc”???
调用创建的由于
答案 0 :(得分:8)
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())
输出
1
2
1
2
说明:
在原始解决方案中,CreateFunc
是一个函数,但总是相同的函数(CreateFunc
,f1
和f2
都是同义词,都指向同一个函数)。在我的解决方案中,CreateFunc
是一个函数,只要它被调用就会返回一个 new 函数,因此每个函数都有自己的状态(即counter
)。
简而言之:原始CreateFunc
是一个值,始终是相同的值。