Condividi tramite


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.

Vedi anche