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.