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.