Как инициализировать структуру как с изменяемым, так и с неизменным полем?
Все примеры структур, которые я читал до сих пор, либо когда все поля являются изменяемыми, либо все поля являются неизменяемыми. Таким образом, это хорошо компилируется:
[<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
один раз.