Я работаю свой путь через F # Wikibook и я попал в секцию на опорных ячеек, в котором появляется следующий фрагмент кода:Инкапсуляция изменяемые состояния
let incr =
let counter = ref 0
fun() ->
counter := !counter + 1
!counter;;
Эта функция затем вызывается в три раза, давая значения 1, 2 и 3 соответственно. Может кто-нибудь объяснить, почему эта функция не возвращает 1 при каждом ее вызове? То, как я интерпретирую этот код (что, очевидно, не является правильной интерпретацией, следовательно, вопросом), состоит в том, что во-первых объявляется счетчик опорных ячеек с содержимым, равным 0
, тогда содержимое «счетчика» увеличивается на 1 а затем разыменовывается с помощью анонимной функции. Поскольку каждый вызов incr();;
объявляет «счетчик» с содержимым 0
, я не понимаю, почему вызов incr();;
не просто возвращает 1 каждый раз.
Может ли кто-нибудь исправить мое понимание?
Заранее спасибо.
Интересно отметить, что вы можете захватить изменяемую переменную 'counter' в закрытии C#, тогда как вам нужно явно сделать' counter' ячейку, выделенную кучей в F #. –
@JohnReynolds См. Запись в блоге здесь: http://lorgonblog.wordpress.com/2008/11/12/on-lambdas-capture-and-mutability/ С помощью изменяемой переменной таким образом иногда бывает сложно рассуждать. Принуждение к использованию контрольной ячейки делает более понятным, что происходит. – mydogisbox