レコード式のコピーと更新
"レコードをコピーし、更新する式" は、既存のレコードをコピーし、指定のフィールドを更新し、更新後のレコードを返す式です。
構文
{ 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 |}
この柔軟性により、通常のレコードと匿名レコードのどちらを使用する場合でも、同じ簡潔な構文が適用されます。
関連項目
.NET