複製和更新記錄運算式
「複製和更新記錄運算式」是一種運算式,可複製現有記錄、更新指定欄位,以及傳回更新的記錄。
語法
{ record-name with
updated-labels }
{| anonymous-record-name with
updated-labels |}
備註
記錄和匿名記錄預設不可變,因此無法更新現有記錄。 若要建立更新的記錄,必須再次指定記錄的所有欄位。 若要簡化這項工作,可以使用「複製和更新運算式」。 此運算式會採用現有記錄,使用運算式中的指定欄位和運算式指定的遺漏欄位,建立相同型別的新記錄。
必須複製現有記錄,且可能要變更部分欄位值時,這可能很實用。
例如,新建立的記錄。
let myRecord2 =
{ MyRecord.X = 1
MyRecord.Y = 2
MyRecord.Z = 3 }
若只要更新該記錄中的兩個欄位,您可以使用「複製和更新記錄運算式」:
let myRecord3 = { myRecord2 with Y = 100; Z = 2 }
巢狀記錄複製和更新
在 F# 7.0 和更新版本中,已增強複製和更新運算式,以支援巢狀記錄欄位的更新。 這項功能可在使用深層巢狀記錄時,提供更簡潔的語法。
請考慮下列範例:
之前
type SteeringWheel = { Type: string }
type CarInterior = { Steering: SteeringWheel; Seats: int }
type Car = { Interior: CarInterior; ExteriorColor: string option }
let beforeThisFeature x =
{ x with Interior = { x.Interior with
Steering = {x.Interior.Steering with Type = "yoke"}
Seats = 5
}
}
之後
有了新功能,您可以使用點表示法來觸達巢狀字段,並直接加以更新:
let withTheFeature x =
{ x with Interior.Steering.Type = "yoke"; Interior.Seats = 5 }
此語法不需要多個 with
表達式。 相反地,它允許直接在巢狀欄位上指定更新,同時允許在同一個運算式中更新多個字段(即使是在不同的巢狀層級)。
匿名記錄
相同的語法延伸也適用於匿名記錄。 此外,您可以使用此語法,將一般記錄複製到匿名記錄,並在程式中新增新的欄位:
let updatedRecord =
{| originalRecord with
Interior.Seats = 4;
Price = 35000 |}
不論您使用的是一般或匿名記錄,此彈性可確保相同的簡潔語法適用。