在施工期间从自身内部引用记录

Mag*_* G. 3 f# record

我试图在同一个构造函数中创建一个记录,该记录使用之前定义的字段之一来计算另一个字段的值.例如

myRecordType = {Foo:int; Bar:int[]}

myRecord = {Foo = 5;
            Bar = Array.init Foo (fun i -> i)}
Run Code Online (Sandbox Code Playgroud)

当我尝试这个时,它不会识别Foo已存在.我也不能参考Foo使用myRecord.Foo,但这是有道理的,因为myRecord尚未构建.但是我会想到Foo并且Bar会在相同的范围内,所以Bar可以访问Foo,但显然不是.

Bar数组的大小取决于数值Foo,那么如何设置这种格式的记录呢?

Bar*_*cki 5

你不能引用其他字段,你甚至不应该理所当然地认为字段评估的顺序.

你可以通过额外的let绑定来做到这一点:

let myrecord = 
    let calcedFoo = 5
    { Foo = calcedFoo; Bar = Array.init calcedFoo id }
Run Code Online (Sandbox Code Playgroud)

您可以将记录构造表达式视为一个函数,其中赋值的右侧是传递给该函数的参数.