Partilhar via


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.

Consulte também