2015-12-01 37 views
0

我需要清楚說明如何聲明對象並在F#中分配定義。如何在F#中聲明和定義對象?

這段代碼發生了什麼事?

let service = { 
    new IService with 
     member this.Translate(_) = raise error } 

我的猜測是,我們正在創建一個對象將實現在飛行中的一些接口,即使存在這樣的來頭這個對象沒有實際的類。因此,我們不需要聲明一個單獨的類來使用它,就可以取消創建對象所涉及的儀式。在這種情況下,我們正在最大限度地減少實施可用於單元測試的模擬對象所涉及的儀式。

我的理解是否準確?

我試圖研究我的問題,並發現爲F#3.0規範(第 - 6.3.8對象表達式)

6.3.8對象表達式下列形式的表達式是一個對象表達式:{新的ty0 args -expresst對象成員接口 ty1 object-members1 ... interface tyn object-membersn}在接口聲明的 的情況下,對象成員是可選的,如果不存在,則認爲 爲空。每組對象成員的形式如下: with member-defns endopt詞法過濾在使用輕量級語法時插入模擬的$ end 令牌。對象 的每個成員表達式成員都可以使用關鍵字成員,覆蓋或默認值。 即使覆蓋成員或實現接口的關鍵字成員,也可以使用該成員或 。

例如:

let obj1 = 
    { new System.Collections.Generic.IComparer<int> with   
      member x.Compare(a,b) = compare (a % 7) (b % 7) } 
+0

,我發現此鏈接有用的:https://msdn.microsoft.com/en-us/library/dd233237.aspx –

回答

3

你可以得到,如果你使用像ILSpy反編譯查看生成的IL什麼幕後發生的事情相當不錯的畫面。對於涉及IComparer的例子,它生成一個隱藏的類,它實現了接口:

internal sealed class [email protected] : IComparer<int> { 
    public [email protected]() : this() { } 
    int IComparer<int>.System-Collections-Generic-IComparer(int x, int y) { 
    int num = x % 7; 
    int num2 = y % 7; 
    if (num < num2) { return -1; } 
    return (num > num2) ? 1 : 0; 
    } 
} 

方法的身體裏面,它然後創建一個新的實例:

IComparer<int> obj1 = new [email protected]();