当前位置 : 主页 > 手机开发 > 其它 >

具有多个构造函数语法的F#继承

来源:互联网 收集:自由互联 发布时间:2021-06-19
我有这个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
我有这个F#课

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 }
网友评论