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


Beállítások

Az F# beállítástípust akkor használja a rendszer, ha egy névvel ellátott értékhez vagy változóhoz nem létezik tényleges érték. Egy beállítás mögöttes típussal rendelkezik, és tartalmazhat egy ilyen típusú értéket, vagy lehet, hogy nem rendelkezik értékkel.

Megjegyzések

Az alábbi kód egy olyan függvényt mutat be, amely egy beállítástípust hoz létre.

let keepIfPositive (a: int) = if a > 0 then Some(a) else None

Amint látható, ha a bemeneti a 0-nál nagyobb, Some(a) jön létre. Ellenkező esetben None jön létre.

A None akkor használatos, ha egy beállítás nem rendelkezik tényleges értékkel. Ellenkező esetben a Some( ... ) kifejezés értéket ad a beállításnak. A Some és None értékek hasznosak a mintaillesztésben, például az alábbi existsfüggvényben, amely true-t ad vissza, ha van értéke az opciónak, és false-t, ha nincs.

let exists (x: int option) =
    match x with
    | Some(x) -> true
    | None -> false

A beállítások használata

A beállításokat gyakran használják, ha a keresés nem ad vissza egyező eredményt, ahogy az az alábbi kódban is látható.

let rec tryFindMatch pred list =
    match list with
    | head :: tail -> if pred (head) then Some(head) else tryFindMatch pred tail
    | [] -> None

// result1 is Some 100 and its type is int option.
let result1 = tryFindMatch (fun elem -> elem = 100) [ 200; 100; 50; 25 ]

// result2 is None and its type is int option.
let result2 = tryFindMatch (fun elem -> elem = 26) [ 200; 100; 50; 25 ]

Az előző kódban a rendszer rekurzív módon keres egy listát. A tryFindMatch függvény egy predikátumfüggvényt pred kap bemenetként, ami logikai értéket ad vissza, valamint egy keresendő listát. Ha egy olyan elem található, amely megfelel a predikátumnak, a rekurzió véget ér, és a függvény a Some(head)kifejezésben lehetőségként adja vissza az értéket. A rekurzió az üres lista egyeztetésével ér véget. Ekkor nem található a head érték, és None lesz visszaadva.

Számos F#-kódtárfüggvény, amely egy gyűjteményben keres egy olyan értéket, amely lehet, hogy létezik, vagy nem létezik, a option típust adja vissza. Ezek a függvények konvenció szerint a try előtaggal kezdődnek, például Seq.tryFindIndex.

A beállítások akkor is hasznosak lehetnek, ha egy érték nem létezik, például ha lehetséges, hogy kivétel jelenik meg egy érték létrehozásakor. Az alábbi példakód ezt szemlélteti.

open System.IO

let openFile filename =
    try
        let file = File.Open(filename, FileMode.Create)
        Some(file)
    with ex ->
        eprintf "An exception occurred with message %s" ex.Message
        None

Az előző példában szereplő openFile függvény típusa string -> File option, mert egy File objektumot ad vissza, ha a fájl sikeresen megnyílik, és kivétel esetén None. A helyzettől függően előfordulhat, hogy nem megfelelő tervezési döntés elkapni egy kivételt ahelyett, hogy lehetővé tenné annak továbbítását.

Emellett továbbra is át lehet adni null vagy egy null értékű értéket egy lehetőség Some esetében. Ezt általában kerülni kell, és általában rutin F# programozásban van, de a .NET-ben a referenciatípusok jellege miatt lehetséges.

Beállítás tulajdonságai és metódusai

A beállítástípus a következő tulajdonságokat és metódusokat támogatja.

Tulajdonság vagy metódus Típus Leírás
None 'T option Statikus tag, amely None értékkel rendelkező beállításértéket hoz létre.
IsNone bool true ad vissza, ha a beállítás None értékkel rendelkezik.
IsSome bool true ad vissza, ha a beállítás értéke nem None.
Some 'T option Olyan statikus tag, amely olyan beállítást hoz létre, amely nem Noneértékkel rendelkezik.
Érték 'T Az alapértelmezett értéket adja vissza, vagy dob egy System.NullReferenceException-t, ha az érték None.

Beállításmodul

Van egy modul, Option, amely hasznos függvényeket tartalmaz, amelyek műveleteket hajtanak végre a beállításokon. Egyes függvények megismétlik a tulajdonságok funkcióit, de olyan környezetekben hasznosak, ahol szükség van egy függvényre. Option.isSome és Option.isNone mindkettő olyan modulfüggvény, amely ellenőrzi, hogy egy beállítás tartalmaz-e értéket. Az Option.get megszerzi az értéket, ha létezik ilyen. Ha nincs érték, System.ArgumentExceptionhibát dob.

Az Option.bind függvény egy függvényt hajt végre az értéken, ha van érték. A függvénynek pontosan egy argumentumot kell tartalmaznia, a paramétertípusnak pedig a beállítástípusnak kell lennie. A függvény visszatérési értéke egy másik beállítástípus.

A beállításmodul olyan függvényeket is tartalmaz, amelyek a listákhoz, tömbökhöz, sorozatokhoz és más gyűjteménytípusokhoz elérhető függvényeknek felelnek meg. Ezek a függvények a következők: Option.map, Option.iter, Option.forall, Option.exists, Option.foldBack, Option.foldés Option.count. Ezek a függvények lehetővé teszik a lehetőségek használatát, például egy nulla vagy egy elemből álló gyűjteményt. További információkért és példákért tekintse meg a kollekciós függvényeket a Listákcímű témakörben.

Átalakítás más típusokká

A beállítások listákká vagy tömbökké alakíthatók. Ha egy lehetőség ezen adatstruktúrák bármelyikére konvertálódik, az eredményül kapott adatstruktúra nulla vagy egy elemből áll. Ha tömbté szeretne alakítani egy beállítást, használja a Option.toArray. Ha egy beállítást listává szeretne alakítani, használja a Option.toList.

Beállítások konvertálása alapértelmezett értékekkel

A listákká és tömbökké alakítás mellett a beállítások más típusokra is konvertálhatók az alapértelmezett értékek Option.defaultValue függvénnyel való megadásával. Ez különösen akkor hasznos, ha azt szeretné, hogy az érték ne legyen None. Például:

let optionString = Some("F#")
let defaultString = optionString |> Option.defaultValue ""
// defaultString is "F#"

let optionInt = None
let defaultInt = optionInt |> Option.defaultValue 0
// defaultInt is 0

A Option.defaultValue függvény lehetővé teszi, hogy Some és None eseteket zökkenőmentesen kezelje a mintaegyezés nélkül.

Lásd még: