Megosztás a következőn keresztül:


Rekordkifejezések másolása és frissítése

A másolási és frissítési rekord kifejezés olyan kifejezés, amely átmásol egy meglévő rekordot, frissíti a megadott mezőket, és visszaadja a frissített rekordot.

Syntax

{ record-name with
    updated-labels }

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

Megjegyzések

A rekordok és a névtelen rekordok alapértelmezés szerint nem módosíthatók, ezért meglévő rekord nem frissíthető. Frissített rekord létrehozásához a rekord összes mezőjét újra meg kell adni. A feladat egyszerűsítése érdekében egy másolási és frissítési kifejezés használható. Ez a kifejezés egy meglévő rekordot vesz fel, egy újat hoz létre ugyanahhoz a típushoz a kifejezés megadott mezőinek és a kifejezés által megadott hiányzó mezőnek a használatával.

Ez akkor lehet hasznos, ha át kell másolnia egy meglévő rekordot, és esetleg módosítania kell a mezőértékek egy részét.

Vegyük például az újonnan létrehozott rekordot.

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

Ha csak két mezőt szeretne frissíteni a rekordban, használhatja a másolási és frissítési rekordkifejezést:

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

Beágyazott rekord másolása és frissítése

Az F# 7.0-s és újabb verzióiban a másolási és frissítési kifejezés tovább lett fejlesztve a beágyazott rekordmezők frissítéseinek támogatásához. Ez a funkció tömörebb szintaxist tesz lehetővé a mélyen beágyazott rekordok használatakor.

Vegyük a következő példát:

Előtte

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

Utána

Az új funkcióval pont jelöléssel elérheti a beágyazott mezőket, és közvetlenül frissítheti őket:

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

Ez a szintaxis nem igényel több with kifejezést. Ehelyett lehetővé teszi a beágyazott mezők frissítéseinek közvetlen megadását, ugyanakkor lehetővé teszi több mező frissítését (akár a beágyazás különböző szintjein is) ugyanabban a kifejezésben.

Névtelen rekordok

Ugyanez a szintaxiskiterjesztés névtelen rekordok esetében is működik. Ezen a szintaxison kívül a normál rekordokat névtelen rekordokká is másolhatja és frissítheti, új mezőket adva hozzá a folyamathoz:

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

Ez a rugalmasság biztosítja, hogy ugyanaz a tömör szintaxis érvényes legyen, függetlenül attól, hogy normál vagy névtelen rekordokkal dolgozik.

Lásd még