首先,我承认这个问题可能是重复的;请告诉我。
我很好奇当需要可变性时,一般的“最佳实践”是什么。 F# 似乎为此提供了两种工具:let mutable
绑定,它的工作方式似乎类似于“大多数”语言中的变量,以及引用单元格(使用ref
函数),需要显式解除引用才能使用。
在以下几种情况下,人们会“被迫”选择其中一种: .NET 互操作倾向于使用可变的<-
,并且在工作流计算中必须使用ref
with :=
。因此,这些情况非常明确,但我很好奇在这些场景之外创建自己的可变变量时该怎么做。一种风格相对于另一种风格有什么优势? (也许进一步了解实施会有所帮助。)
Thanks!
我只能支持什么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!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)