复制和更新记录表达式

复制和更新记录表达式是一个复制现有记录、更新指定字段并返回更新后的记录的表达式。

语法

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

这种灵活性可确保无论使用的是常规记录还是匿名记录,相同的简洁语法都适用。

另请参阅