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 exists
fü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.ArgumentException
hibá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.