Copiare e aggiornare espressioni di record
Un'espressione di record di copia e aggiornamento è un'espressione che copia un record esistente, aggiorna i campi specificati e restituisce il record aggiornato.
Sintassi
{ record-name with
updated-labels }
{| anonymous-record-name with
updated-labels |}
Osservazioni:
I record e i record anonimi non sono modificabili per impostazione predefinita, pertanto non è possibile aggiornare un record esistente. Per creare un record aggiornato, è necessario specificare di nuovo tutti i campi di un record. Per semplificare questa attività, è possibile usare un'espressione di copia e aggiornamento. Questa espressione accetta un record esistente, crea uno nuovo dello stesso tipo usando i campi specificati dall'espressione e il campo mancante specificato dall'espressione.
Ciò può essere utile quando è necessario copiare un record esistente ed eventualmente modificare alcuni valori di campo.
Prendere per esempio un record appena creato.
let myRecord2 =
{ MyRecord.X = 1
MyRecord.Y = 2
MyRecord.Z = 3 }
Per aggiornare solo due campi nel record, è possibile usare l'espressione di copia e aggiornamento del record:
let myRecord3 = { myRecord2 with Y = 100; Z = 2 }
Copia e aggiornamento di record annidati
In F# 7.0 e versioni successive, l'espressione di copia e aggiornamento è stata migliorata per supportare gli aggiornamenti nei campi dei record annidati. Questa funzionalità consente una sintassi più concisa quando si lavora con record annidati in modo approfondito.
Si consideri l'esempio seguente:
Prima
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
}
}
Dopo
Con la nuova funzionalità, è possibile usare la notazione dot-notation per raggiungere i campi annidati e aggiornarli direttamente:
let withTheFeature x =
{ x with Interior.Steering.Type = "yoke"; Interior.Seats = 5 }
Questa sintassi elimina la necessità di più with
espressioni. Consente invece di specificare gli aggiornamenti sui campi annidati direttamente, consentendo comunque l'aggiornamento di più campi (anche a livelli diversi di annidamento) nella stessa espressione.
Record anonimi
La stessa estensione della sintassi funziona anche per i record anonimi. Inoltre, è possibile usare questa sintassi per copiare e aggiornare i record regolari in quelli anonimi, aggiungendo nuovi campi nel processo:
let updatedRecord =
{| originalRecord with
Interior.Seats = 4;
Price = 35000 |}
Questa flessibilità garantisce che la stessa sintassi concisa si applichi se si utilizzano record regolari o anonimi.