共用方式為


複製和更新記錄運算式

「複製和更新記錄運算式」是一種運算式,可複製現有記錄、更新指定欄位,以及傳回更新的記錄。

語法

{ 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 |}

不論您使用的是一般或匿名記錄,此彈性可確保相同的簡潔語法適用。

另請參閱