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

如何在F#中声明和定义对象?,f#,F#,我需要弄清楚对象是如何在F#中声明和分配定义的 这段代码中发生了什么 let service = { new IService with member this.Translate(_) = raise error } 我猜我们正在创建一个对象,它将动态实现一些接口,即使没有支持这个对象的实际类。因此,我们不必声明单独的类来使用它,从而消除了创建对象所涉及的仪式。在本例中,我们将最小化实现可在单元测试中使用的模拟对象所涉及的仪式 我的理解准确吗? 我试图研究我的问题,

我需要弄清楚对象是如何在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…接口tyn object membersn} 在接口声明中,对象成员是可选的,并且是 如果没有,则认为是空的。每组对象成员的形式如下: 使用成员defns-endit词法筛选插入模拟$end 使用轻量级语法时的标记。对象的每个成员 表达式成员可以使用关键字member、override或default。 即使在重写成员或 实现一个接口

例如:

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

如果使用像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;
  }
}
内部密封类obj1@2:I比较{
公开的obj1@2():this(){}
系统集合通用IComparer(intx,inty){
int num=x%7;
int num2=y%7;
如果(numnum2)?1:0;
}
}
然后,在方法体内部创建一个新实例:

IComparer<int> obj1 = new obj1@2();
IComparer obj1=新建obj1@2();

如果使用像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;
  }
}
内部密封类obj1@2:I比较{
公开的obj1@2():this(){}
系统集合通用IComparer(intx,inty){
int num=x%7;
int num2=y%7;
如果(numnum2)?1:0;
}
}
然后,在方法体内部创建一个新实例:

IComparer<int> obj1 = new obj1@2();
IComparer obj1=新建obj1@2();

我发现此链接很有用:我发现此链接很有用: