Copiar e atualizar expressões de registro
Uma expressão de registro de cópia e atualização é uma expressão que copia um registro existente, atualiza campos especificados e retorna o registro atualizado.
Sintaxe
{ record-name with
updated-labels }
{| anonymous-record-name with
updated-labels |}
Observações
Os registos e os registos anónimos são imutáveis por predefinição, pelo que não é possível atualizar um registo existente. Para criar um registo atualizado, todos os campos de um registo teriam de ser especificados novamente. Para simplificar essa tarefa, uma expressão de cópia e atualização pode ser usada. Essa expressão usa um registro existente, cria um novo do mesmo tipo usando campos especificados da expressão e o campo ausente especificado pela expressão.
Isso pode ser útil quando você precisa copiar um registro existente e, possivelmente, alterar alguns dos valores de campo.
Tomemos como exemplo um registro recém-criado.
let myRecord2 =
{ MyRecord.X = 1
MyRecord.Y = 2
MyRecord.Z = 3 }
Para atualizar apenas dois campos nesse registro, você pode usar a expressão copiar e atualizar registro:
let myRecord3 = { myRecord2 with Y = 100; Z = 2 }
Cópia e atualização de registro aninhado
No F# 7.0 e posterior, a expressão de cópia e atualização foi aprimorada para oferecer suporte a atualizações em campos de registro aninhados. Esse recurso permite uma sintaxe mais concisa ao trabalhar com registros profundamente aninhados.
Considere o seguinte exemplo:
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
}
}
Depois de
Com o novo recurso, você pode usar a notação de pontos para alcançar campos aninhados e atualizá-los diretamente:
let withTheFeature x =
{ x with Interior.Steering.Type = "yoke"; Interior.Seats = 5 }
Esta sintaxe elimina a necessidade de múltiplas with
expressões. Em vez disso, ele permite especificar atualizações em campos aninhados diretamente, enquanto ainda permite que vários campos (mesmo em diferentes níveis de aninhamento) sejam atualizados na mesma expressão.
Registos Anónimos
A mesma extensão de sintaxe também funciona para registros anônimos. Além disso, você pode usar essa sintaxe para copiar e atualizar registros regulares em anônimos, adicionando novos campos no processo:
let updatedRecord =
{| originalRecord with
Interior.Seats = 4;
Price = 35000 |}
Essa flexibilidade garante que a mesma sintaxe concisa se aplique quer você esteja trabalhando com registros regulares ou anônimos.