我有一个记录类型
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在类型定义中进行计算而不是赋值?
解决了:
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)
如果你不想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)