F# - 将参考单元传递给函数

时间:2011-02-03 16:13:48

标签: f#

我只是想知道是否有人可以向我解释如何将引用单元格传递给非类成员的函数。我一直在关注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组件的兼容性?我不介意使用可变值,我只是想了解这些事情。

由于

2 个答案:

答案 0 :(得分:5)

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

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

let myint = ref 10
myadd1func myint

这可能比使用byref类型(与本地mutable值一样)稍慢,但我不认为它在功能样式中经常需要,所以应该没问题。< / p>

答案 1 :(得分:1)

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