F#的tripleWise实现场景中为何要使用reference引用而非直接拷贝值
问题解答
这个问题的核心和F#的变量默认不可变特性直接相关:
i、j使用引用(ref)的原因
F# 中普通let声明的变量默认是不可变的,一旦赋值就不允许修改。而这段代码的逻辑需要实现滑动窗口效果:每次输出三元组(!i, !j, k)之后,需要把前两个值向后滑动一位——原来的j要变成新的i,当前的k要变成新的j,这样下一轮循环拿到新的k时就能输出连续的相邻三元组。
如果不用ref而是直接用普通let i = e.Current声明,后续就无法修改i、j的存储值,代码会编译失败。ref是F#提供的轻量可变值封装,通过!读取值、:=修改值,正好满足这里需要反复修改i、j取值的需求。
补充:你也可以用
let mutable i = e.Current的可变变量写法实现相同效果,后续赋值用i <- j即可,作者选择ref只是F#实现可变值的两种常见方式之一。
k不需要引用的原因k是每次while循环迭代时新声明的局部变量,只需要存储当前迭代读取到的枚举器Current值,使用完成后就会随当前迭代结束销毁,下一轮循环会重新声明新的k变量,全程不需要修改自身存储的值,因此直接用普通不可变的let绑定即可。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

