Udostępnij za pośrednictwem


Kopiowanie i aktualizacja wyrażeń rekordów

Wyrażenie rekordu kopiowania i aktualizowania jest wyrażeniem , które kopiuje istniejący rekord, aktualizuje określone pola i zwraca zaktualizowany rekord.

Składnia

{ record-name with
    updated-labels }

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

Uwagi

Rekordy i rekordy anonimowe są domyślnie niezmienne, więc nie można zaktualizować istniejącego rekordu. Aby utworzyć zaktualizowany rekord, należy ponownie określić wszystkie pola rekordu. Aby uprościć to zadanie, można użyć wyrażenia kopiowania i aktualizacji. To wyrażenie przyjmuje istniejący rekord, tworzy nowy jeden z tego samego typu przy użyciu określonych pól z wyrażenia i brakującego pola określonego przez wyrażenie.

Może to być przydatne, gdy trzeba skopiować istniejący rekord i ewentualnie zmienić niektóre wartości pól.

Weź na przykład nowo utworzony rekord.

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

Aby zaktualizować tylko dwa pola w tym rekordzie, można użyć wyrażenia kopiowania i aktualizowania rekordu:

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

Zagnieżdżone kopiowanie i aktualizowanie rekordów

W języku F# 7.0 lub nowszym wyrażenie kopiowania i aktualizacji zostało ulepszone w celu obsługi aktualizacji w zagnieżdżonych polach rekordów. Ta funkcja umożliwia bardziej zwięzłą składnię podczas pracy z głęboko zagnieżdżonych rekordów.

Rozważmy następujący przykład:

Przed

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

Dzięki nowej funkcji można użyć notacji kropkowej, aby uzyskać dostęp do zagnieżdżonych pól i zaktualizować je bezpośrednio:

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

Ta składnia eliminuje potrzebę wielu with wyrażeń. Zamiast tego umożliwia bezpośrednie określanie aktualizacji w zagnieżdżonych polach, jednocześnie zezwalając na aktualizowanie wielu pól (nawet na różnych poziomach zagnieżdżania) w tym samym wyrażeniu.

Rekordy anonimowe

To samo rozszerzenie składni działa również dla rekordów anonimowych. Ponadto można użyć tej składni, aby skopiować i zaktualizować regularne rekordy do anonimowych, dodając nowe pola w procesie:

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

Ta elastyczność zapewnia, że ta sama zwięzła składnia ma zastosowanie niezależnie od tego, czy pracujesz z zwykłymi, czy anonimowymi rekordami.

Zobacz też