【问题标题】:F# - passing reference cells to functionsF# - 将参考单元格传递给函数
【发布时间】:2011-02-03 16:13:47
【问题描述】:

我只是想知道是否有人可以向我解释如何将引用单元格传递给非类成员的函数。我一直在关注msdn页面msdn reference cells

我有以下代码:

let myint = ref 32
let mutable myint2 = 23

type addone() = 
    member t.myadd1func (x:int byref) = 
        x <- x + 1

let myadd1func (x:int byref) = 
    x <- x + 1

let adder = new addone()

adder.myadd1func myint
// myadd1func myint <---- this line does not compile

myadd1func &myint2 // <----- this line does though


printfn "%d" !myint
printfn "%d" myint2

我的问题是......我对类上的“Myadd1func”方法的调用与在它之后定义的“myadd1func”函数之间的根本区别是什么?

在我写这篇文章的时候,我猜这个函数不喜欢将 .net 对象引用传递给它,因为这可能会破坏与其他 IL 组件的兼容性??我不介意使用可变值,我只是想了解这些东西。

谢谢

【问题讨论】:

标签: f#


【解决方案1】:

我认为 F# 中的 byref 类型应该仅用于现有功能(如 kvb 所解释的)足够好的互操作性目的。如果你想声明一个修改传递给它的一些参数的函数,我只会使用普通的引用单元格(例如int ref 类型):

let myadd1func (x:int ref) =
  x := !x + 1 

let myint = ref 10
myadd1func myint

这可能比使用byref 类型(连同本地mutable 值)稍微慢一些,但我认为在函数式风格中并不经常需要它,所以应该没问题。

【讨论】:

    【解决方案2】:

    这在 F# 规范的Type-directed Conversions at Member Invocations 部分进行了说明。为了与其他 .NET 组件的互操作性,可以将引用单元格传递给采用 byref 参数的成员,编译器将自动将其视为单元格的 contents 字段的取消引用。但是,这不适用于 let-bound 函数,您应该直接使用 addressof 运算符 (&amp;)。您仍然可以使用 ref 单元格,但您必须自己显式取消引用 contents 字段,因此这应该适用于您的示例:myadd1func &amp;myint.contents

    【讨论】:

    • 非常感谢您指出 F# 规范 - 我认为当我遇到此类情况时,其中还有其他内容可以帮助我。
    猜你喜欢
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多