Как инициализировать структуру как с изменяемым, так и с неизменным полем?

Все примеры структур, которые я читал до сих пор, либо когда все поля являются изменяемыми, либо все поля являются неизменяемыми. Таким образом, это хорошо компилируется:

[<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 один или два раза (сначала со значением по умолчанию)?

1 ответ

Решение

Явный синтаксис конструкции, используемый во втором примере, работает для всех структур, независимо от того, имеют ли они изменяемые поля или нет.

Мы также могли бы переписать первый пример с использованием этого синтаксиса, хотя он выглядит не так красиво. В этом также есть техническая разница member this.X определяет свойство, тогда как val X определяет поле.

В третьем случае вы написали бы это:

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

Это только явно назначает Y один раз.

Другие вопросы по тегам