Копирование и обновление выражений записей
Выражение копии и обновления записи — это выражение , копирующее существующую запись, обновляет указанные поля и возвращает обновленную запись.
Синтаксис
{ 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 |}
Эта гибкость гарантирует, что один и тот же краткий синтаксис применяется к работе с обычными или анонимными записями.