Copie et mise à jour des expressions d’enregistrement
Une expression d’enregistrement de copie et de mise à jour est une expression qui copie un enregistrement existant, met à jour les champs spécifiés et retourne l’enregistrement mis à jour.
Syntaxe
{ record-name with
updated-labels }
{| anonymous-record-name with
updated-labels |}
Notes
Les enregistrements et les enregistrements anonymes sont immuables par défaut, il n’est donc pas possible de mettre à jour un enregistrement existant. Pour créer un enregistrement mis à jour, tous les champs d’un enregistrement doivent être à nouveau spécifiés. Pour simplifier cette tâche, une expression de copie et de mise à jour peut être utilisée. Cette expression prend un enregistrement existant, en crée un nouveau du même type à l’aide des champs spécifiés de l’expression et du champ manquant spécifié par l’expression.
Cela peut être utile lorsque vous devez copier un enregistrement existant et éventuellement modifier certaines des valeurs de champ.
Par exemple, prenez un enregistrement nouvellement créé.
let myRecord2 =
{ MyRecord.X = 1
MyRecord.Y = 2
MyRecord.Z = 3 }
Pour mettre à jour seulement deux champs de cet enregistrement, vous pouvez utiliser l’expression d’enregistrement de copie et de mise à jour :
let myRecord3 = { myRecord2 with Y = 100; Z = 2 }
Copie et mise à jour d’enregistrements imbriquées
Dans F# 7.0 et versions ultérieures, l’expression de copie et de mise à jour a été améliorée pour prendre en charge les mises à jour sur les champs d’enregistrement imbriqués. Cette fonctionnalité permet une syntaxe plus concise lors de l’utilisation d’enregistrements profondément imbriqués.
Prenons l’exemple suivant :
Avant le
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
}
}
Après
Avec la nouvelle fonctionnalité, vous pouvez utiliser la notation par points pour atteindre les champs imbriqués et les mettre à jour directement :
let withTheFeature x =
{ x with Interior.Steering.Type = "yoke"; Interior.Seats = 5 }
Cette syntaxe élimine la nécessité de plusieurs with
expressions. Au lieu de cela, il permet de spécifier des mises à jour sur des champs imbriqués directement, tout en permettant à plusieurs champs (même à différents niveaux d’imbrication) d’être mis à jour dans la même expression.
Enregistrements anonymes
La même extension de syntaxe fonctionne également pour les enregistrements anonymes. En outre, vous pouvez utiliser cette syntaxe pour copier et mettre à jour des enregistrements réguliers en enregistrements anonymes, en ajoutant de nouveaux champs dans le processus :
let updatedRecord =
{| originalRecord with
Interior.Seats = 4;
Price = 35000 |}
Cette flexibilité garantit que la même syntaxe concise s’applique si vous travaillez avec des enregistrements réguliers ou anonymes.