Поделиться через


Копирование и обновление выражений записей

Выражение копии и обновления записи — это выражение , копирующее существующую запись, обновляет указанные поля и возвращает обновленную запись.

Синтаксис

{ record-name with
    updated-labels }

{| anonymous-record-name with
    updated-labels |}

Замечания

Записи и анонимные записи по умолчанию неизменяемы, поэтому невозможно обновить существующую запись. Чтобы создать обновленную запись, все поля записи необходимо будет указать еще раз. Чтобы упростить эту задачу, можно использовать выражение копирования и обновления. Это выражение принимает существующую запись, создает новый из того же типа, используя указанные поля из выражения и отсутствующие поля, указанные выражением.

Это может быть полезно при копировании существующей записи и, возможно, изменении некоторых значений поля.

Например, только что созданная запись.

let myRecord2 =
    { MyRecord.X = 1
      MyRecord.Y = 2
      MyRecord.Z = 3 }

Чтобы обновить только два поля в этой записи, можно использовать выражение копирования и обновления записи:

let myRecord3 = { myRecord2 with Y = 100; Z = 2 }

Вложенная копия и обновление записей

В F# 7.0 и более поздних версиях выражение копирования и обновления было улучшено для поддержки обновлений в вложенных полях записей. Эта функция обеспечивает более краткий синтаксис при работе с глубоко вложенными записями.

Рассмотрим следующий пример:

Перед

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
                        }
    }

После

С помощью новой функции можно использовать нотацию точек для достижения вложенных полей и их непосредственного обновления:

let withTheFeature x =
    { x with Interior.Steering.Type = "yoke"; Interior.Seats = 5 }

Этот синтаксис устраняет необходимость в нескольких with выражениях. Вместо этого он позволяет указывать обновления для вложенных полей напрямую, позволяя обновлять несколько полей (даже на разных уровнях вложения) в одном выражении.

Анонимные записи

То же расширение синтаксиса также работает для анонимных записей. Кроме того, этот синтаксис можно использовать для копирования и обновления регулярных записей в анонимные, добавляя новые поля в процессе:

let updatedRecord =
    {| originalRecord with
        Interior.Seats = 4;
        Price = 35000 |}

Эта гибкость гарантирует, что один и тот же краткий синтаксис применяется к работе с обычными или анонимными записями.

См. также