我们如何在F#中定义不可变结构的ctor,它只接受部分字段。或者,与C#相比,我们如何将结构归零(例如在下面的c#示例中调用this())?#/ p>
c#中
struct Point
{
private readonly int _x;
private readonly int _y;
public Point(int x) : this() // Will zero the struct
{
_x = x;
}
public Point(int y) : this() // Will zero the struct
{
_y = y;
}
}
上面的Point(x)ctor通过调用this()将结构清零,然后设置单个字段。这就是我所追求的。以下示例被大大简化,问题是如何将结构归零,然后只设置一个字段。
F#
type Point =
struct
val X: float
val Y: float
new(x: float) = ? // how to zero out the struct and then set ONLY X ?
end
答案 0 :(得分:5)
您可以使用Point(x, 0.0)
调用结构中的另一个构造函数:
type Point =
struct
val X: float
val Y: float
new(x: float, y: float) = { X = x; Y = y }
new(x: float) = Point(x, 0.0)
end
作为旁注,您还可以使用具有type
属性的普通Struct
定义来声明结构。这当然是一种风格问题,但我倾向于选择这种变体:
[<Struct>]
type Point =
val X: float
val Y: float
new(x: float, y: float) = { X = x; Y = y }
new(x: float) = Point(x, 1.0)
答案 1 :(得分:3)
我认为你的C#代码的F#版本就是这样的
[<Struct>]
type Point =
val mutable X: float
val mutable Y: float
let p = Point(X = 1.0)
虽然结构成员是可变的,但p
并非如此,因此您无法再次设置成员。
// this will cause a compile error
p.X <- 2.0