返回带闭包的函数

时间:2011-11-08 10:50:57

标签: f#

以下代码:

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”???

调用创建的

由于

1 个答案:

答案 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是一个函数,但总是相同的函数(CreateFuncf1f2都是同义词,都指向同一个函数)。在我的解决方案中,CreateFunc是一个函数,只要它被调用就会返回一个 new 函数,因此每个函数都有自己的状态(即counter)。

简而言之:原始CreateFunc是一个值,始终是相同的值。