Opções de valor
O tipo de opção de valor em F# é usado quando as duas circunstâncias a seguir são válidas:
- Um cenário é apropriado para uma Opção F#.
- O uso de uma estrutura fornece um benefício de desempenho em seu cenário.
Nem todos os cenários sensíveis ao desempenho são "resolvidos" usando structs. Você deve considerar o custo adicional de copiar quando os utilizar em vez de tipos de referência. No entanto, grandes programas em F# geralmente instanciam muitos tipos opcionais que fluem através de caminhos críticos e, nesses casos, os structs geralmente podem gerar um desempenho geral melhor durante a vida útil de um programa.
Definição
A opção de valor é definida como uma união discriminada por estrutura que é semelhante ao tipo de opção de referência. Sua definição pode ser pensada dessa maneira:
[<StructuralEquality; StructuralComparison>]
[<Struct>]
type ValueOption<'T> =
| ValueNone
| ValueSome of 'T
A opção de valor está em conformidade com a igualdade estrutural e a comparação. A principal diferença é que o nome compilado, o nome do tipo e os nomes de caso indicam que é um tipo de valor.
Usando opções de Valor
As opções de valor são usadas exatamente como Opções. ValueSome
é usado para indicar que um valor está presente e ValueNone
é usado quando um valor não está presente:
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!"
Assim como acontece com Opções, a convenção de nomenclatura para uma função que retorna ValueOption
é prefixá-la com try
.
Propriedades e métodos da opção de valor
No momento, há uma propriedade para opções de valor: Value
. Um InvalidOperationException é gerado se nenhum valor estiver presente quando essa propriedade for invocada.
Funções de opção de valor
O módulo ValueOption
no FSharp.Core contém funcionalidade equivalente ao módulo Option
. Existem algumas diferenças no nome, como defaultValueArg
:
val defaultValueArg : arg:'T voption -> defaultValue:'T -> 'T
Isso funciona exatamente como defaultArg
no módulo Option
, mas opera em uma opção de valor.