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