Dela via


Kopiera och uppdatera postuttryck

Ett kopierings- och uppdateringspostuttryck är ett uttryck som kopierar en befintlig post, uppdaterar angivna fält och returnerar den uppdaterade posten.

Syntax

{ record-name with
    updated-labels }

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

Kommentarer

Poster och anonyma poster är oföränderliga som standard, så det går inte att uppdatera en befintlig post. Om du vill skapa en uppdaterad post måste alla fält i en post anges igen. För att förenkla den här uppgiften kan ett kopierings- och uppdateringsuttryck användas. Det här uttrycket tar en befintlig post, skapar en ny av samma typ med hjälp av angivna fält från uttrycket och det fält som saknas som anges av uttrycket.

Detta kan vara användbart när du måste kopiera en befintlig post och eventuellt ändra några av fältvärdena.

Ta till exempel en nyligen skapad post.

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

Om du bara vill uppdatera två fält i posten kan du använda uttrycket kopiera och uppdatera post:

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

Kapslad postkopiering och uppdatering

I F# 7.0 och senare har kopierings - och uppdateringsuttrycket förbättrats för att stödja uppdateringar av kapslade postfält. Den här funktionen ger mer koncis syntax när du arbetar med djupt kapslade poster.

Ta följande som exempel:

Före

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

Efter

Med den nya funktionen kan du använda punkt notation för att nå kapslade fält och uppdatera dem direkt:

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

Den här syntaxen eliminerar behovet av flera with uttryck. I stället kan du ange uppdateringar på kapslade fält direkt, samtidigt som flera fält (även på olika kapslingsnivåer) kan uppdateras i samma uttryck.

Anonyma poster

Samma syntaxtillägg fungerar även för anonyma poster. Dessutom kan du använda den här syntaxen för att kopiera och uppdatera vanliga poster till anonyma poster och lägga till nya fält i processen:

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

Den här flexibiliteten säkerställer att samma koncisa syntax gäller oavsett om du arbetar med vanliga eller anonyma poster.

Se även