我正在尝试创建一条记录,该记录使用先前定义的字段之一来计算同一构造函数中另一个字段的值。例如
myRecordType = {Foo:int; Bar:int[]}
myRecord = {Foo = 5;
Bar = Array.init Foo (fun i -> i)}
当我尝试这样做时,它无法将 Foo
识别为已经存在。我也无法使用 myRecord.Foo
引用 Foo
,但这是有道理的,因为 myRecord
尚未构建。但是我会认为 Foo
和 Bar
会在同一个范围内,所以 Bar
可以访问 Foo
,但显然不是。
Bar
数组的大小取决于Foo
的值,那么如何设置这种格式的记录呢?
最佳答案
您不能引用其他字段,您甚至不应该认为字段评估的顺序是理所当然的。
你可以通过额外的 let 绑定(bind)来实现:
let myrecord =
let calcedFoo = 5
{ Foo = calcedFoo; Bar = Array.init calcedFoo id }
您可以将记录构造表达式视为一个函数,其中赋值的右侧是传递给该函数的参数。
关于f# - 在构造期间从自身内部引用记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32406610/