Sdílet prostřednictvím


Možnosti pro hodnoty

Typ Možnosti hodnoty v jazyce F# se používá v případě, že jsou splněny následující dvě okolnosti:

  1. Scénář je vhodný pro možnost F#.
  2. Použití struktury poskytuje ve vašem scénáři výhodu výkonu.

Ne všechny scénáře citlivé na výkon jsou "vyřešeny" pomocí struktur. Při použití namísto referenčních typů je nutné zvážit další náklady na kopírování. Velké programy jazyka F# ale často vytvářejí řadu volitelných typů, které procházejí horkými cestami, a v takových případech můžou struktury často přinést lepší celkový výkon v průběhu životnosti programu.

Definice

Možnost hodnoty je definována jako diskriminovaná sjednocení struktury , která se podobá typu odkazové možnosti. Jeho definici si lze představit tímto způsobem:

[<StructuralEquality; StructuralComparison>]
[<Struct>]
type ValueOption<'T> =
    | ValueNone
    | ValueSome of 'T

Možnost hodnoty odpovídá strukturální rovnosti a porovnání. Hlavní rozdíl spočívá v tom, že zkompilovaný název, název typu a názvy velkých a malých písmen označují, že se jedná o typ hodnoty.

Použití možností hodnot

Možnosti hodnot se používají stejně jako Možnosti. ValueSome slouží k označení, že je hodnota přítomna, a ValueNone používá se, pokud hodnota není přítomna:

let tryParseDateTime (s: string) =
    match System.DateTime.TryParse(s) with
    | (true, dt) -> ValueSome dt
    | (false, _) -> ValueNone

let possibleDateString1 = "1990-12-25"
let possibleDateString2 = "This is not a date"

let result1 = tryParseDateTime possibleDateString1
let result2 = tryParseDateTime possibleDateString2

match (result1, result2) with
| ValueSome d1, ValueSome d2 -> printfn "Both are dates!"
| ValueSome d1, ValueNone -> printfn "Only the first is a date!"
| ValueNone, ValueSome d2 -> printfn "Only the second is a date!"
| ValueNone, ValueNone -> printfn "None of them are dates!"

Stejně jako u možnosti se konvence vytváření názvů pro funkci, která vrací ValueOption , má předponu try.

Vlastnosti a metody Value Option

V tuto chvíli existuje jedna vlastnost pro možnosti hodnoty: Value. Je InvalidOperationException vyvolána, pokud není k dispozici žádná hodnota při vyvolání této vlastnosti.

Funkce možnosti hodnoty

Modul ValueOption v FSharp.Core obsahuje ekvivalentní funkce modulu Option . Existuje několik rozdílů v názvu, například defaultValueArg:

val defaultValueArg : arg:'T voption -> defaultValue:'T -> 'T

Funguje stejně jako defaultArg v Option modulu, ale místo toho pracuje s možností hodnoty.

Viz také