Compartir a través de


Expresiones de registro de copia y actualización

Una expresión de registro de copia y actualización es una expresión que copia un registro existente, actualiza campos especificados y devuelve el registro actualizado.

Sintaxis

{ record-name with
    updated-labels }

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

Comentarios

Los registros y los registros anónimos son inmutables de manera predeterminada, por lo que no es posible actualizar un registro existente. Para crear un registro actualizado, todos los campos de un registro se tendrían que especificar de nuevo. Para simplificar esta tarea se puede usar una expresión de copia y actualización. Esta expresión toma un registro existente, crea uno del mismo tipo mediante campos especificados de la expresión y el campo que falta especificado por la expresión.

Esto puede ser útil si hay que copiar un registro existente y, posiblemente, cambiar algunos de los valores de los campos.

Tome por ejemplo un registro recién creado.

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

Para actualizar solo dos campos de ese registro, puede usar la expresión de registro de copia y actualización:

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

Copia y actualización de registros anidados

En F# 7.0 y versiones posteriores, la expresión de copia y actualización se ha mejorado para admitir actualizaciones en campos de registro anidados. Esta característica permite una sintaxis más concisa al trabajar con registros profundamente anidados.

Considere el ejemplo siguiente:

Antes

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

Después

Con la nueva característica, puede usar la notación de puntos para llegar a campos anidados y actualizarlos directamente:

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

Esta sintaxis elimina la necesidad de varias with expresiones. En su lugar, permite especificar actualizaciones en campos anidados directamente, a la vez que permite actualizar varios campos (incluso en distintos niveles de anidamiento) en la misma expresión.

Registros anónimos

La misma extensión de sintaxis también funciona para registros anónimos. Además, puede usar esta sintaxis para copiar y actualizar registros regulares en los anónimos, agregando nuevos campos en el proceso:

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

Esta flexibilidad garantiza que la misma sintaxis concisa se aplique si está trabajando con registros normales o anónimos.

Consulte también