我正在通过F#Wikibook工作,我已经进入了参考单元格的部分,其中出现以下代码片段:
let incr =
let counter = ref 0
fun () ->
counter := !counter + 1
!counter;;
Run Code Online (Sandbox Code Playgroud)
然后调用此函数三次,分别给出值1,2和3.有人可以解释为什么这个函数每次调用时都不会返回1吗?我解释这段代码的方式(显然不是正确的解释,因此问题)是,首先,声明参考单元格'counter',内容等于0,然后'counter'的内容递增1并且然后使用匿名函数解除引用.由于每次调用incr();;声明'counter'都有内容0,我不明白为什么调用incr();;不会每次只返回1.
谁能纠正我的理解?
提前致谢.
可以这样想:incr是价值,而不是功能.它的值是一个捕获某些状态(即counter)的闭包.这是随后被多次调用的闭包(incr仅执行/分配一次).也许看到等效的C#会有所帮助.
static Func<int> MakeCounter() {
int counter = 0;
return () => {
counter++;
return counter;
};
}
var incr = MakeCounter();
incr(); //1
incr(); //2
incr(); //3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
164 次 |
| 最近记录: |