Freigeben über


Kopieren und Aktualisieren von Datensatzausdrücken

Ein Ausdruck zum Kopieren und Aktualisieren eines Datensatzes ist ein Ausdruck, der einen vorhandenen Datensatz kopiert, die angegebenen Felder aktualisiert und den aktualisierten Datensatz zurückgibt.

Syntax

{ record-name with
    updated-labels }

{| anonymous-record-name with
    updated-labels |}

Bemerkungen

Datensätze und anonyme Datensätze sind standardmäßig unveränderlich, sodass es nicht möglich ist, einen vorhandenen Datensatz zu aktualisieren. Um einen aktualisierten Datensatz zu erstellen, müssen alle Felder eines Datensatzes erneut angegeben werden. Um diese Aufgabe zu vereinfachen, kann ein Kopier- und Aktualisierungsausdruck verwendet werden. Dieser Ausdruck nimmt einen vorhandenen Datensatz, erstellt einen neuen desselben Typs, indem er die angegebenen Felder aus dem Ausdruck und das fehlende Feld verwendet, das durch den Ausdruck angegeben wird.

Dies kann nützlich sein, wenn Sie einen vorhandenen Datensatz kopieren und möglicherweise einige der Feldwerte ändern müssen.

Nehmen Sie beispielsweise einen neu erstellten Datensatz.

let myRecord2 =
    { MyRecord.X = 1
      MyRecord.Y = 2
      MyRecord.Z = 3 }

Um nur zwei Felder in diesem Datensatz zu aktualisieren, können Sie den Ausdruck Kopieren und Aktualisieren des Datensatzes verwenden:

let myRecord3 = { myRecord2 with Y = 100; Z = 2 }

Geschachtelte Datensatzkopie und -aktualisierung

In F# 7.0 und höher wurde der Kopier- und Aktualisierungsausdruck erweitert, um Updates für geschachtelte Datensatzfelder zu unterstützen. Dieses Feature ermöglicht eine präzisere Syntax beim Arbeiten mit tief geschachtelten Datensätzen.

Betrachten Sie das folgende Beispiel:

Vorher

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

After

Mit dem neuen Feature können Sie die Punktnotation verwenden, um geschachtelte Felder zu erreichen und sie direkt zu aktualisieren:

let withTheFeature x =
    { x with Interior.Steering.Type = "yoke"; Interior.Seats = 5 }

Diese Syntax beseitigt die Notwendigkeit mehrerer with Ausdrücke. Stattdessen können Aktualisierungen für geschachtelte Felder direkt angegeben werden, während gleichzeitig mehrere Felder (auch auf unterschiedlichen Schachtelungsebenen) im selben Ausdruck aktualisiert werden können.

Anonyme Datensätze

Die gleiche Syntaxerweiterung funktioniert auch für anonyme Datensätze. Darüber hinaus können Sie diese Syntax verwenden, um reguläre Datensätze in anonyme Datensätze zu kopieren und zu aktualisieren und neue Felder im Prozess hinzuzufügen:

let updatedRecord =
    {| originalRecord with
        Interior.Seats = 4;
        Price = 35000 |}

Diese Flexibilität stellt sicher, dass die gleiche präzise Syntax gilt, unabhängig davon, ob Sie mit regulären oder anonymen Datensätzen arbeiten.

Siehe auch