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.