This module implements types which encapsulate an optional value.
A value of type Option[T]
either contains a value x (represented as some(x)
) or is empty (none(T)
).
This can be useful when you have a value that can be present or not. The absence of a value is often represented by nil
, but it is not always available, nor is it always a good solution.
Let's start with an example: a procedure that finds the index of a character in a string.
import options proc find(haystack: string, needle: char): Option[int] = for i, c in haystack: if c == needle: return some(i) return none(int) # This line is actually optional, # because the default is empty
try: assert("abc".find('c').get() == 2) # Immediately extract the value except UnpackError: # If there is no value assert false # This will not be reached, because the value is present
The get
operation demonstrated above returns the underlying value, or raises UnpackError
if there is no value. There is another option for obtaining the value: unsafeGet
, but you must only use it when you are absolutely sure the value is present (e.g. after checking isSome
). If you do not care about the tiny overhead that get
causes, you should simply never use unsafeGet
.
How to deal with an absence of a value:
let result = "team".find('i') # Nothing was found, so the result is `none`. assert(result == none(int)) # It has no value: assert(result.isNone) try: echo result.get() assert(false) # This will not be reached except UnpackError: # Because an exception is raised discard
Option[T] = object when T is SomePointer: val else: val has
UnpackError = ref object of ValueError
proc some[T](val: T): Option[T]
Option
that has this value. proc option[T](val: T): Option[T]
nil
to the none-option. proc none(T: typedesc): Option[T]
Option
for this type that has no value. proc none[T](): Option[T]
none(T)
. proc isSome[T](self: Option[T]): bool {...}{.inline.}
not (x == y)
. proc isNone[T](self: Option[T]): bool {...}{.inline.}
proc unsafeGet[T](self: Option[T]): T
some
. Behavior is undefined for none
. proc get[T](self: Option[T]): T
proc get[T](self: Option[T]; otherwise: T): T
proc get[T](self: var Option[T]): var T
proc map[T](self: Option[T]; callback: proc (input: T))
proc map[T, R](self: Option[T]; callback: proc (input: T): R): Option[R]
proc flatten[A](self: Option[Option[A]]): Option[A]
proc flatMap[A, B](self: Option[A]; callback: proc (input: A): Option[B]): Option[B]
map
, with the difference that the callback returns an Option, not a raw value. This allows multiple procs with a signature of A -> Option[B]
(including A = B) to be chained together. proc filter[T](self: Option[T]; callback: proc (input: T): bool): Option[T]
proc `==`(a, b: Option): bool
true
if both Option``s are ``none
, or if they have equal values proc `$`[T](self: Option[T]): string
© 2006–2018 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/options.html