Sdílet prostřednictvím


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.

Viz také