Возврат функции с замыканием - PullRequest
6 голосов
/ 08 ноября 2011

Следующий код:

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 Ответ

8 голосов
/ 08 ноября 2011
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 был значением, всегда одним и тем же значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...