我只能支持gradbot所说的-当我需要突变时,我更喜欢let mutable
。
关于实现和两者之间的区别-ref
单元本质上是通过一个包含可变记录字段的非常简单的记录来实现的。您可以自己轻松地编写它们:
type ref<'T> = // '
{ mutable value : 'T } // '
// the ref function, ! and := operators look like this:
let (!) (a:ref<_>) = a.value
let (:=) (a:ref<_>) v = a.value <- v
let ref v = { value = v }
两种方法之间的显着区别是,let mutable
将可变值存储在堆栈上(作为C#中的可变变量),而ref
将可变值存储在堆分配记录的字段中。这可能会影响性能,但是我没有任何数字...
因此,ref
可以为使用的可变值加上别名-这意味着您可以创建两个引用相同可变值的值:
let a = ref 5 // allocates a new record on the heap
let b = a // b references the same record
b := 10 // modifies the value of 'a' as well!
let mutable a = 5 // mutable value on the stack
let mutable b = a // new mutable value initialized to current value of 'a'
b <- 10 // modifies the value of 'b' only!