我有这个F#课 module File1open Systemopen System.Collections.Generictype TimeRangeList'e(getter: DateTime * DateTime - List'e, ?maybe_tFrom: DateTime, ?maybe_tTo: DateTime) as this = inherit List'e() //inherit List'e(getter(defaultArg m
module File1
open System
open System.Collections.Generic
type TimeRangeList<'e>(getter: DateTime * DateTime -> List<'e>, ?maybe_tFrom: DateTime, ?maybe_tTo: DateTime) as this =
inherit List<'e>()
//inherit List<'e>(getter(defaultArg maybe_tTo DateTime.Now, defaultArg maybe_tFrom ((defaultArg maybe_tTo DateTime.Now).AddDays(-1.0))))
let tTo = defaultArg maybe_tTo DateTime.Now
let tFrom = defaultArg maybe_tFrom (tTo.AddDays(-1.0))
do this.AddRange(getter(tFrom, tTo))
现在我想添加构造函数并使用here中的语法
type TimeRangeList<'e> =
inherit List<'e>
val tFrom: DateTime
val tTo: DateTime
new (getter: DateTime * DateTime -> List<'e>, ?maybe_tFrom: DateTime, ?maybe_tTo: DateTime) = {
inherit List<'e>()
//inherit List<'e>(defaultArg maybe_tFrom ((defaultArg maybe_tTo DateTime.Now).AddDays(-1.0)), getter(defaultArg maybe_tTo DateTime.Now))
tTo = defaultArg maybe_tTo DateTime.Now
tFrom = defaultArg maybe_tFrom (tTo.AddDays(-1.0)) //tTo undefined
//tFrom = defaultArg maybe_tFrom ((defaultArg maybe_tTo DateTime.Now).AddDays(-1.0))
}
do this.AddRange(getter(tFrom, tTo)) //primary constructor required
这段代码给出了两个错误:
>’tFrom = …’它表示’tTo not defined’而tTo显然在
范围;作为一种解决方法,我可以重复defaultArg调用,如图所示
以下(注释)行.有没有更好的办法?
>在调用’AddRange’的最后一行,它抱怨只能在主构造函数中执行调用,这是公平的.但是,如何调用必要的AddRange来初始化列表?我尝试了不同的选择,但找不到方法.注释在注释的继承行中显示,但最后我反复冗余地调用defaultArg;必须有一个更清晰,更优雅的方式
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))
文档链接:
>在其他构造函数中,use the then keyword instead of do
>在附加构造函数put as this after the new() expression中定义实例的自引用名称
为了解释一下,{field = value; field2 = value2}语法不必是定义辅助构造函数的new()块中找到的唯一表达式.它只需要是最后一个表达式,即返回的表达式. (这里,即使技术上then块是构造函数中的“last”块,它的返回值(需要为unit)也会被忽略,构造函数的实际返回值是then块中找不到的最后一个表达式. ).因此,可以安全地使用let表达式来定义要放入类的字段中的值,并且让表达式可以像在普通代码中那样相互引用.因此,如果您需要将复杂或昂贵的计算放入多个字段中,您可以这样:
new () =
let result = expensiveCalculationIWantToDoOnlyOnce()
{ field1 = result; field2 = result + 1; field3 = result + 2 }
