Kopírování a aktualizace výrazů záznamů
Výraz pro kopírování a aktualizaci záznamu je výraz, který kopíruje existující záznam, aktualizuje zadaná pole a vrátí aktualizovaný záznam.
Syntaxe
{ record-name with
updated-labels }
{| anonymous-record-name with
updated-labels |}
Poznámky
Záznamy a anonymní záznamy jsou ve výchozím nastavení neměnné, takže existující záznam není možné aktualizovat. Pokud chcete vytvořit aktualizovaný záznam, bude nutné znovu zadat všechna pole záznamu. Pro zjednodušení tohoto úkolu lze použít výraz kopírování a aktualizace. Tento výraz přebírá existující záznam, vytvoří nový typ pomocí zadaných polí z výrazu a chybějícího pole určeného výrazem.
To může být užitečné, když potřebujete zkopírovat existující záznam a případně změnit některé hodnoty polí.
Vytvořte například nově vytvořený záznam.
let myRecord2 =
{ MyRecord.X = 1
MyRecord.Y = 2
MyRecord.Z = 3 }
Pokud chcete aktualizovat pouze dvě pole v daném záznamu, můžete použít výraz pro kopírování a aktualizaci záznamu:
let myRecord3 = { myRecord2 with Y = 100; Z = 2 }
Kopírování a aktualizace vnořených záznamů
V jazyce F# 7.0 a novějším byl výraz kopírování a aktualizace vylepšen tak, aby podporoval aktualizace v polích vnořených záznamů. Tato funkce umožňuje stručnější syntaxi při práci s hluboko vnořenými záznamy.
Představte si následující příklad:
Před
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
}
}
Po
Pomocí nové funkce můžete pomocí tečkované notace spojit vnořená pole a aktualizovat je přímo:
let withTheFeature x =
{ x with Interior.Steering.Type = "yoke"; Interior.Seats = 5 }
Tato syntaxe eliminuje potřebu více with
výrazů. Místo toho umožňuje přímo zadat aktualizace v vnořených polí a současně umožňuje aktualizaci více polí (i na různých úrovních vnoření) ve stejném výrazu.
Anonymní záznamy
Stejné rozšíření syntaxe funguje i pro anonymní záznamy. Kromě toho můžete pomocí této syntaxe kopírovat a aktualizovat běžné záznamy do anonymních záznamů a přidávat do procesu nová pole:
let updatedRecord =
{| originalRecord with
Interior.Seats = 4;
Price = 35000 |}
Tato flexibilita zajišťuje, aby stejná stručná syntaxe platila bez ohledu na to, jestli pracujete s běžnými nebo anonymními záznamy.