如何为F#中的结构定义一个ctor,它反过来调用结构的默认ctor

时间:2014-09-23 12:38:26

标签: struct constructor f#

我们如何在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

2 个答案:

答案 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