Udostępnij za pośrednictwem


Opcje wartości

Typ opcji wartości w języku F# jest używany, gdy są przechowywane następujące dwie okoliczności:

  1. Scenariusz jest odpowiedni dla opcji języka F#.
  2. Użycie struktury zapewnia korzyść z wydajności w danym scenariuszu.

Nie wszystkie scenariusze wrażliwe na wydajność są "rozwiązywane" przy użyciu struktur. Podczas korzystania z nich zamiast typów referencyjnych należy rozważyć dodatkowy koszt kopiowania. Jednak duże programy języka F# często tworzy wystąpienia wielu typów opcjonalnych, które przepływają przez ścieżki gorące, a w takich przypadkach struktury mogą często uzyskać lepszą ogólną wydajność w okresie istnienia programu.

Definicja

Opcja wartości jest definiowana jako struktura unii dyskryminowanej, która jest podobna do typu opcji odwołania. Jej definicję można traktować w ten sposób:

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

Opcja wartości jest zgodna z równością strukturalną i porównaniem. Główną różnicą jest to, że skompilowana nazwa, nazwa typu i nazwy liter wskazują, że jest to typ wartości.

Korzystanie z opcji wartości

Opcje wartości są używane podobnie jak Opcje. ValueSome służy do wskazywania, że wartość jest obecna i ValueNone jest używana, gdy wartość nie jest obecna:

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!"

Podobnie jak w przypadku opcji, konwencja nazewnictwa funkcji, która zwraca ValueOption , to prefiks jej z try.

Właściwości i metody opcji wartości

Obecnie istnieje jedna właściwość opcji wartości: Value. Element jest zgłaszany, jeśli żadna InvalidOperationException wartość nie jest obecna, gdy ta właściwość jest wywoływana.

Funkcje opcji wartości

Moduł ValueOption w pliku FSharp.Core zawiera równoważne funkcje modułu Option . Istnieje kilka różnic w nazwie, takich jak defaultValueArg:

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

Działa to podobnie jak defaultArg w Option module, ale zamiast tego działa na opcji wartości.

Zobacz też