f# - 如何使用可变字段和不可变字段初始化结构体?

标签 f# c#-to-f#

到目前为止,我读过的所有结构示例要么是所有字段都是可变的,要么是所有字段都是不可变的。因此,编译良好:

[<Struct>]
type Number(x:int) =
    member this.X = x

这也是:

[<Struct>]
type Number =
    val mutable X:int
    new(x) = {X = x}

但是,我不知道如何为具有一个可变字段和一个不可变字段的结构编写显式构造函数:

[<Struct>]
type Numbers(x:int) =
    member this.X = x
    val mutable Y:int
    new(x,y) = ???

显式构造函数必须明确调用隐式构造函数。到目前为止我尝试过的所有简单解决方案都失败了。

后续问题:无论解决方案是什么,是否都会为字段 Y 分配一次或两次(首先使用默认值)?

最佳答案

第二个示例中使用的显式构造语法适用于所有结构,无论它们是否具有可变字段。

我们还可以重写第一个示例以使用该语法,尽管它不太好看。还有一个技术差异,member this.X 定义一个属性,而 val X 定义一个字段。

在第三种情况下,你可以这样写:

[<Struct>]
type Numbers =
    val X : int
    val mutable Y : int
    new(x, y) = { X = x; Y = y }

这只显式分配Y一次。

关于f# - 如何使用可变字段和不可变字段初始化结构体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23848238/

相关文章:

f# - 不使用模运算符 F# 计算余数

f# - 如何为 Saturn 应用构建集成测试

types - F# 奇怪的类型错误消息

f# - 在 F# 中使用管道操作时出现意外的类型编译问题

f# - 使用 F# 的可选参数和选项类型

.net - 在 F# 中正确使用带有指针的 P/invoke

c# - C# default 关键字在 F# 中的等价物是什么?

entity-framework - Entity Framework 相关代码从c#改写到f#的难度

F#:有些、无或异常(exception)?

f# - F#中的字典排序