F#:让可变与引用

标签 f# mutable

首先,我承认这个问题可能是重复的;请告诉我。

我很好奇当需要可变性时,一般的“最佳实践”是什么。 F# 似乎为此提供了两种工具:let mutable绑定(bind),它的工作方式似乎类似于“大多数”语言中的变量,以及需要显式取消引用才能使用的引用单元格(使用 ref 函数创建)。

有几种情况,其中一个人“被迫”进入其中一个:.NET 互操作倾向于使用可变的 <- ,并且在工作流计算中必须使用 ref:= 。因此,这些情况非常明确,但我很好奇在这些场景之外创建自己的可变变量时该怎么做。一种风格相对于另一种风格有什么优势? (也许进一步深入了解实现会有所帮助。)

谢谢!

最佳答案

我只能支持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!

关于F#:让可变与引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3221200/

相关文章:

excel - 在 F# (Office.Interop) 中按字母顺序对 Excel 行进行排序

F# 查找唯一元组数组的进一步要求

ruby - 如何防止方法改变其参数?

python - 列表更改意外地反射(reflect)在子列表中

c# - 如何在 C# 中创建 F# 匿名记录?

visual-studio - 构建时如何修复输出窗口困惑?

java - 对可变对象使用 volatile 关键字

recursion - 递归地将列表解包为元素

java - 可变变量的属性如何在多个变量引用之间共享?

asynchronous - 如何并行执行两个具有不同结果类型的 Async<> 调用?