Options de valeur

Le type Option de valeur dans F# est utilisé lorsque les deux circonstances suivantes surviennent :

  1. Un scénario est approprié pour une Option F#.
  2. L’utilisation d’un struct confère un avantage en matière de performances dans votre scénario.

Tous les scénarios sensibles aux performances ne sont pas « résolus » à l’aide de structs. Vous devez prendre en compte le coût supplémentaire de la copie lorsque vous les utilisez au lieu des types références. Toutefois, les programmes F# de grande taille instancient généralement de nombreux types facultatifs qui transitent par des chemins d’accès chauds. Dans ce cas, les structs peuvent souvent générer de meilleures performances globales sur la durée de vie d’un programme.

Définition

Le type Option de valeur est défini en tant qu’union discriminée de struct qui est similaire au type Option de référence. Sa définition peut être pensée comme suit :

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

Le type Option de valeur est conforme à l’égalité structurelle et à la comparaison. La principale différence est que le nom compilé, le nom de type et les noms de cas indiquent tous qu’il s’agit d’un type valeur.

Utilisation des options de valeur

Les options de valeur sont utilisées de la même façon que les options. ValueSome est utilisé pour indiquer qu’une valeur est présente et ValueNone est utilisé lorsqu’aucune valeur n’est présente :

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

À l’instar des Options, la convention d’affectation de noms d’une fonction qui renvoie ValueOption consiste à la préfixer avec try.

Méthodes et propriétés des options de valeur

Il existe actuellement une propriété pour les options de valeur : Value. Une exception InvalidOperationException est déclenchée si aucune valeur n’est présente lorsque cette propriété est appelée.

Fonctions d’option de valeur

Le module ValueOption dans FSharp.Core contient une fonctionnalité équivalente à celle du module Option. Il existe quelques différences de nom, comme defaultValueArg :

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

Cela agit exactement comme defaultArg dans le module Option, mais cela fonctionne sur une option de valeur à la place.

Voir aussi