struct - 如何在 F# 中为结构体定义一个 ctor,进而调用该结构体的默认 ctor

标签 struct constructor f#

我们如何在 F# 中为不可变结构定义一个仅接受部分字段的构造函数。或者,与 C# 相比,我们如何在 f# 中将结构清零(例如在下面的 c# 示例中调用 this())?

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) 向量通过调用 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

最佳答案

您可以使用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

顺便说一句,您还可以使用带有 Struct 属性的普通 type 定义来声明结构。这当然是一个风格问题,但我更喜欢这种变体:

[<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)

关于struct - 如何在 F# 中为结构体定义一个 ctor,进而调用该结构体的默认 ctor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25995332/

相关文章:

c - 将字符串分成更小的部分并组织结构(C 编程)

Java - 构造函数不会显式调用父类(super class)构造函数,Java 也不会插入父类(super class)构造函数

javascript - JS原型(prototype),创建具有新特性的对象

F# 如何在递归可区分联合中指定类型限制

enums - F#枚举到字符串的转换

c - 如果内存大小相等,如何将 C 结构转换为另一种结构类型?

reflection - GO 语言 : anonymous structs & Reflection combination

f# - F# 的 monad 实现在可用关键字数量方面是独一无二的吗?

c++ - 将类引用传递给函数

c++ - 如何防止其他人在堆栈上创建您的类的新实例?