代码之家  ›  专栏  ›  技术社区  ›  J Cooper

F:让可变与参考

  •  75
  • J Cooper  · 技术社区  · 14 年前

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

    我很好奇对于那些需要可变性的情况,一般的“最佳实践”是什么。F似乎为此提供了两种设施: let mutable 绑定,它看起来像“大多数”语言中的变量,以及引用单元格(使用 ref 函数)需要显式取消引用才能使用。

    有两种情况下,其中一种情况是“强制”进入另一种情况:.NET interop倾向于使用可变的with <- 在工作流计算中必须使用 裁判 具有 := . 所以这些情况是非常明确的,但是我很好奇在那些场景之外创建自己的可变变量时该怎么做。一种款式比另一种有什么优势?(也许对实现的深入了解会有所帮助。)

    谢谢!

    5 回复  |  直到 6 年前
        1
  •  122
  •   Tomas Petricek    14 年前

    我只能支持什么 年级学生 说-当我需要突变的时候,我更喜欢 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 }
    

    这两种方法的显著区别在于 让可变 在堆栈上存储可变值(作为C中的可变变量),同时 裁判 将可变值存储在堆分配记录的字段中。这可能对性能有一些影响,但我没有任何数字…

    正因为如此,使用的可变值 裁判 可以是别名-这意味着您可以创建两个引用相同可变值的值:

    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!
    
        2
  •  18
  •   Community chadoh    7 年前

    相关问题: “您提到局部可变值不能被闭包捕获,因此需要使用ref。原因是需要在堆上分配在关闭中捕获的可变值(因为关闭是在堆上分配的)。“来自 F# ref-mutable vars vs object fields

    我想 let mutable 优于参考单元格。我个人只在需要时使用参考单元。

    由于递归和尾部调用,我编写的大多数代码不使用可变变量。如果我有一组可变的数据,我使用一个记录。对于我使用的对象 让可变 使私有可变变量。我只在闭包中使用引用单元格,通常是事件。

        3
  •  6
  •   Andrii    8 年前

    如上所述 this MSDN Blog article 断面 可变值的简化使用 ,您不再需要lambda的引用单元格。 所以一般来说,你不再需要它们了。

        4
  •  4
  •   Mau    14 年前

    This article 布莱恩可能会提供一个答案。

    易变的是易于使用和有效(没有包装),但不能捕获在羔羊。REF细胞 可以 被捕获,但是否冗长且效率较低(?-对此不确定)。

        5
  •  3
  •   danlei    14 年前

    你可能想看看 Mutable Data 维基中的部分。

    为了方便起见,以下是一些相关的报价:

    经常使用可变关键字 使用记录类型创建可变的 记录

    可变变量有点 有限:无法访问可变项 超出功能范围 它们的定义。明确地, 这意味着不可能 引用子函数中的可变项 其他功能。

    Ref单元格绕过 可变的限制。事实上,裁判 单元格是非常简单的数据类型, 在记录中包装可变字段 类型。

    因为在 堆,它们可以在 多功能