如何在F#中声明和定义对象?

时间:2015-12-01 18:29:47

标签: f#

我需要明确如何声明对象并在F#中分配定义。

此代码中发生了什么?

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

我的猜测是我们正在创建一个即时实现某个界面的对象,即使没有实际的类可以支持这个对象。因此,我们通过不必声明一个单独的类来使用它来删除创建对象所涉及的仪式。在这种情况下,我们将最小化用于实现可在单元测试中使用的模拟对象的仪式。

我的理解准确吗?

我试着研究我的问题并找到F#3.0的规范(第6.3.8节对象表达式)

  

6.3.8对象表达式以下表单的表达式是一个对象表达式:{new ty0 args-expropt object-members interface   ty1 object-members1 ... interface tyn object-membersn}在这种情况下   对于接口声明,对象成员是可选的   如果没有,则认为是空的。每组对象成员都具有以下形式:   使用member-defns endopt词法过滤插入模拟$ end   使用轻量级语法时的标记。对象的每个成员   表达式成员可以使用关键字member,override或default。   即使覆盖成员或者,也可以使用关键字成员   实现一个接口。

例如:

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

1 个答案:

答案 0 :(得分:3)

如果您使用ILSpy等反编译器查看生成的IL,您可以很好地了解幕后发生的情况。对于涉及IComparer的示例,它会生成一个隐藏类,该类实现接口:

internal sealed class obj1@2 : IComparer<int> {
  public obj1@2() : 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 obj1@2();