Это синтаксис, который вы ищете:
module File1
open System
open System.Collections.Generic
type TimeRangeList<'e> =
inherit List<'e>
val tFrom: DateTime
val tTo: DateTime
new (getter: DateTime * DateTime -> List<'e>, ?maybe_tFrom: DateTime, ?maybe_tTo: DateTime) as this =
let to_ = defaultArg maybe_tTo DateTime.Now
let from_ = defaultArg maybe_tFrom (to_.AddDays(-1.0))
{
inherit List<'e>()
tTo = to_
tFrom = from_
}
then
this.AddRange(getter(this.tFrom, this.tTo))
Ссылки на документацию:
Чтобы пояснить немного, синтаксис { field = value; field2 = value2 }
не обязательно должен быть выражением only , найденным в блоке new()
, который определяет вторичный конструктор. Это просто должно быть выражение last , то есть возвращаемое выражение. (Здесь, хотя технически блок then
является «последним» блоком в конструкторе, его возвращаемое значение (которое должно быть unit
) игнорируется, а фактическое возвращаемое значение конструктора является последним выражением не найден в then
блоке ). Следовательно, можно безопасно использовать выражения let
ранее, чтобы определить значения, которые вы хотите поместить в поля вашего класса, и эти выражения let
могут ссылаться друг на друга так же, как в обычном коде. Так что если у вас есть сложный или дорогой расчет, который вам нужно поместить в несколько полей, вы можете сделать что-то вроде:
new () =
let result = expensiveCalculationIWantToDoOnlyOnce()
{ field1 = result; field2 = result + 1; field3 = result + 2 }