Opcje wartości
Typ opcji wartości w języku F# jest używany, gdy są przechowywane następujące dwie okoliczności:
- Scenariusz jest odpowiedni dla opcji języka F#.
- 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.