创建实例时设置记录属性

Ale*_*ler 3 f#

我有一个记录类型

type Record = { Start: DateTime; End: DateTime; Duration: TimeSpan }
let record = { Start = DateTime.Now; End = DateTime(2021,12,1) }
Run Code Online (Sandbox Code Playgroud)

此代码将无法编译,因为没有为 field 指定分配Duration

是否可以Duration在类型定义中进行计算而不是赋值?

Ale*_*ler 5

解决了:

type Record = { Start: DateTime; End: DateTime; }
with
  member this.Duration = this.End - this.Start

let record = { Start = DateTime.Now; End = DateTime(2021,12,1) }
Run Code Online (Sandbox Code Playgroud)


bri*_*rns 5

如果你不想Duration每次调用时都重新计算,你可以这样做:

type Record = private { Start: DateTime; End: DateTime; Duration: TimeSpan }

let create startTime endTime =
    {
        Start = startTime
        End = endTime
        Duration = endTime - startTime
    }

let record = create DateTime.Now (DateTime(2021,12,1))
Run Code Online (Sandbox Code Playgroud)

请注意,我已经创建了这些字段private,因此用户将被迫调用create。这种方法的唯一缺点是用户根本无法再访问这些字段,因此您可能需要为它们提供单独的访问器:

type Record = private { _Start: DateTime; _End: DateTime; _Duration: TimeSpan } with
    member this.Start = this._Start
    member this.End = this._End
    member this.Duration = this._Duration

let create startTime endTime =
    {
        _Start = startTime
        _End = endTime
        _Duration = endTime - startTime
    }

let record = create DateTime.Now (DateTime(2021,12,1))
Run Code Online (Sandbox Code Playgroud)