options
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.
Basic usage
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
let found = "abc".find('c')
assert found.isSome and found.get() == 2
The get operation demonstrated above returns the underlying value, or raises UnpackDefect if there is no value. Note that UnpackDefect inherits from system.Defect, and should therefore never be caught. Instead, rely on checking if the option contains a value with isSome and isNone procs.
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) Imports
Types
Option[T] = object when T is SomePointer: val else: val has- An optional type that stores its value and state separately in a boolean. Source Edit
UnpackDefect = object of Defect
- Source Edit
UnpackError {...}{.deprecated: "See corresponding Defect".} = UnpackDefect- Source Edit
Procs
proc option[T](val: T): Option[T] {...}{.inline.}-
Can be used to convert a pointer type (
ptrorreforproc) to an option type. It convertsniltoNone.See also:
Example:
type Foo = ref object a: int b: string var c: Foo assert c.isNil var d = option(c) assert d.isNoneSource Edit proc some[T](val: T): Option[T] {...}{.inline.}-
Returns an
Optionthat has the valueval.See also:
Example:
var a = some("abc") b = some(42) assert $type(a) == "Option[system.string]" assert b.isSome assert a.get == "abc" assert $b == "Some(42)"Source Edit proc none(T: typedesc): Option[T] {...}{.inline.}-
Returns an
Optionfor this type that has no value.See also:
Example:
var a = none(int) assert a.isNone assert $type(a) == "Option[system.int]"
Source Edit proc none[T](): Option[T] {...}{.inline.}- Alias for none(T) proc. Source Edit
proc isSome[T](self: Option[T]): bool {...}{.inline.}- Checks if an
Optioncontains a value.Example:
var a = some(42) b = none(string) assert a.isSome assert not b.isSome
Source Edit proc isNone[T](self: Option[T]): bool {...}{.inline.}- Checks if an
Optionis empty.Example:
var a = some(42) b = none(string) assert not a.isNone assert b.isNone
Source Edit proc get[T](self: Option[T]): lent T {...}{.inline.}-
Returns contents of an
Option. If it isNone, then an exception is thrown.See also:
- get proc with the default return value
Example:
let a = some(42) b = none(string) assert a.get == 42 doAssertRaises(UnpackDefect): echo b.get
Source Edit proc get[T](self: Option[T]; otherwise: T): T {...}{.inline.}- Returns the contents of the
Optionor anotherwisevalue if theOptionisNone.Example:
var a = some(42) b = none(int) assert a.get(9999) == 42 assert b.get(9999) == 9999
Source Edit proc get[T](self: var Option[T]): var T {...}{.inline.}- Returns contents of the
var Option. If it isNone, then an exception is thrown.Example:
let a = some(42) b = none(string) assert a.get == 42 doAssertRaises(UnpackDefect): echo b.get
Source Edit proc map[T](self: Option[T]; callback: proc (input: T)) {...}{.inline.}-
Applies a
callbackfunction to the value of theOption, if it has one.See also:
- map proc for a version with a callback which returns a value
- filter proc
Example:
var d = 0 proc saveDouble(x: int) = d = 2*x let a = some(42) b = none(int) b.map(saveDouble) assert d == 0 a.map(saveDouble) assert d == 84
Source Edit proc map[T, R](self: Option[T]; callback: proc (input: T): R): Option[R] {...}{. inline.}-
Applies a
callbackfunction to the value of theOptionand returns anOptioncontaining the new value.If the
OptionisNone,Noneof the return type of thecallbackwill be returned.See also:
-
flatMap proc for a version with a callback which returns an
Option - filter proc
Example:
var a = some(42) b = none(int) proc isEven(x: int): bool = x mod 2 == 0 assert $(a.map(isEven)) == "Some(true)" assert $(b.map(isEven)) == "None[bool]"
Source Edit -
flatMap proc for a version with a callback which returns an
proc flatten[A](self: Option[Option[A]]): Option[A] {...}{.inline.}- Remove one level of structure in a nested
Option.Example:
let a = some(some(42)) assert $flatten(a) == "Some(42)"
Source Edit proc flatMap[A, B](self: Option[A]; callback: proc (input: A): Option[B]): Option[ B] {...}{.inline.}-
Applies a
callbackfunction to the value of theOptionand returns anOptioncontaining the new value.If the
OptionisNone,Noneof the return type of thecallbackwill be returned.Similar to
map, with the difference that thecallbackreturns anOption, not a raw value. This allows multiple procs with a signature ofA -> Option[B]to be chained together.See also:
Example:
proc doublePositives(x: int): Option[int] = if x > 0: return some(2*x) else: return none(int) let a = some(42) b = none(int) c = some(-11) assert a.flatMap(doublePositives) == some(84) assert b.flatMap(doublePositives) == none(int) assert c.flatMap(doublePositives) == none(int)Source Edit proc filter[T](self: Option[T]; callback: proc (input: T): bool): Option[T] {...}{. inline.}-
Applies a
callbackto the value of theOption.If the
callbackreturnstrue, the option is returned asSome. If it returnsfalse, it is returned asNone.See also:
Example:
proc isEven(x: int): bool = x mod 2 == 0 let a = some(42) b = none(int) c = some(-11) assert a.filter(isEven) == some(42) assert b.filter(isEven) == none(int) assert c.filter(isEven) == none(int)
Source Edit proc `==`(a, b: Option): bool {...}{.inline.}- Returns
trueif bothOptions areNone, or if they are bothSomeand have equal values.Example:
let a = some(42) b = none(int) c = some(42) d = none(int) assert a == c assert b == d assert not (a == b)
Source Edit proc `$`[T](self: Option[T]): string
-
Get the string representation of the
Option.If the
Source EditOptionhas a value, the result will beSome(x)wherexis the string representation of the contained value. If theOptiondoes not have a value, the result will beNone[T]whereTis the name of the type contained in theOption. proc unsafeGet[T](self: Option[T]): lent T {...}{.inline.}-
Returns the value of a
some. Behavior is undefined fornone.Note: Use it only when you are absolutely sure the value is present (e.g. after checking isSome). Generally, using get proc is preferred.
Source Edit
© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/options.html