2011-02-03 62 views
2

我只是想知道是否有人可以向我解釋如何將參考單元傳遞給不是類成員的函數。我一直在關注的MSDN頁面msdn reference cellsF# - 將參考單元傳遞給函數

我有以下代碼:

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組件的兼容性?我不介意使用可變值,我只是想了解這些東西。

由於

+0

您可能還會覺得這很有趣。 http://stackoverflow.com/questions/3221200/f-let-mutable-vs-ref – gradbot 2011-02-03 16:31:24

回答

1

這在F#說明書的Type-directed Conversions at Member Invocations部分進行說明。對於與其他.NET組件的互操作性,可以將參考單元傳遞給採用byref參數的成員,並且編譯器將自動將其視爲取消引用單元的contents字段。但是,這不適用於let-bound函數,您應該直接使用addressof運算符(&)。你仍然可以使用一個引用單元格,但你必須明確地取消引用contents場自己,所以這應該在你的榜樣工作:myadd1func &myint.contents

+0

非常感謝您指點我的F#規範 - 我認爲還有其他東西在那裏會幫助我,當我遇到情況像這些。 – Jimmy 2011-02-03 17:04:15

5

我覺得byref型F#中應僅用於互操作性purpsoes在現有功能的使用(如kvb所解釋的)足夠好。如果你想聲明的是修改一些參數傳遞給它的功能,我只想用普通的引用單元格(如int ref型):

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

let myint = ref 10 
myadd1func myint 

這可能是比使用byref型(連同當地mutable值稍慢),但我認爲它在功能風格上並不經常需要,所以它應該沒問題。

+0

感謝Tomas給你評論 - 我現在在我的代碼中使用它 – Jimmy 2011-02-04 16:06:26