次の方法で共有


レコード式のコピーと更新

"レコードをコピーし、更新する式" は、既存のレコードをコピーし、指定のフィールドを更新し、更新後のレコードを返す式です。

構文

{ record-name with
    updated-labels }

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

解説

レコードと匿名レコードは既定で変更不可であり、既存のレコードを更新することはできません。 レコードを更新するには、レコードの全フィールドをもう一度指定する必要があります。 この作業を簡単にするために "コピーと更新の式" を使用できます。 この式は既存のレコードを受け取り、式で指定されたフィールドと、式で指定されたが足りないフィールドを使用して同じ型の新しいレコードを作成します。

既存のレコードをコピーし、ことによるとフィールド値の一部を変更しなければならないとき、これは便利です。

たとえば、新しく作成されたレコードがあります。

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

そのレコードの中で 2 つのフィールドだけを更新する場合、"レコードをコピーし、更新する式" を使用できます。

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

入れ子になったレコードのコピーと更新

F# 7.0 以降では、入れ子になったレコード フィールドの更新をサポートするために、 copy および update 式 が強化されました。 この機能を使用すると、深く入れ子になったレコードを操作するときに、より簡潔な構文を使用できます。

次の例を確認してください。

以前

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

この柔軟性により、通常のレコードと匿名レコードのどちらを使用する場合でも、同じ簡潔な構文が適用されます。

関連項目