Compartilhar via


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.

Confira também