Copiar e atualizar expressões de registro
Uma expressão de copiar e atualizar registro é uma expressão que copia um registro, atualiza campos especificados e retorna o registro atualizado.
Sintaxe
{ record-name with
updated-labels }
{| anonymous-record-name with
updated-labels |}
Comentários
Registros e registros anônimos são imutáveis por padrão, portanto, não é possível atualizar um registro. Para criar um registro atualizado, todos os campos de um registro precisariam ser especificados novamente. Para simplificar essa tarefa, uma expressão de copiar e atualizar pode ser usada. Essa expressão pega um registro e cria outra 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 e, possivelmente, alterar alguns dos valores de campo.
Por exemplo, considere um registro que acaba de ser 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 o 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 dar 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
}
}
Após
Com o novo recurso, você pode usar a notação de ponto para acessar campos aninhados e atualizá-los diretamente:
let withTheFeature x =
{ x with Interior.Steering.Type = "yoke"; Interior.Seats = 5 }
Essa sintaxe elimina a necessidade de várias 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.
Registros 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 se você estiver trabalhando com registros regulares ou anônimos.