Option
type represents an optional value: every Option
is either Some
and
contains a value, or None
, and does not. Option
types are very common in Cairo code, as
they have a number of uses:
- Initial values
- Return values for functions that are not defined over their entire input range (partial functions)
- Return value for otherwise reporting simple errors, where
None
is returned on error - Optional struct fields
- Optional function arguments
None
case.
The question mark operator, ?
Similar to the Result
type, when writing code that calls many functions that return the
Option
type, handling Some
/None
can be tedious. The question mark
operator, ?
, hides some of the boilerplate of propagating values
up the call stack.
It replaces this:
?
will result in the Some
’s unwrapped value, unless the
result is None
, in which case None
is returned early from the enclosing function.
?
can be used in functions that return Option
because of the
early return of None
that it provides.
Method overview
In addition to working with pattern matching,Option
provides a wide
variety of different methods.
Querying the variant
Theis_some
and is_none
methods return true
if the Option
is Some
or None
, respectively.
Extracting the contained value
These methods extract the contained value in anOption
when it
is the Some
variant. If the Option
is None
:
expect
panics with a provided custom messageunwrap
panics with a generic messageunwrap_or
returns the provided default valueunwrap_or_default
returns the default value of the typeT
(which must implement theDefault
trait)unwrap_or_else
returns the result of evaluating the provided function
Transforming contained values
These methods transformOption
to Result
:
ok_or
transformsSome(v)
toOk(v)
, andNone
toErr(err)
using the provided defaulterr
value.ok_or_else
transformsSome(v)
toOk(v)
, andNone
to a value ofErr
using the provided function
Some
variant:
map
transformsOption
toOption
by applying the provided function to the contained value ofSome
and leavingNone
values unchanged
Option
to a value of a possibly
different type U
:
map_or
applies the provided function to the contained value ofSome
, or returns the provided default value if theOption
isNone
map_or_else
applies the provided function to the contained value ofSome
, or returns the result of evaluating the provided fallback function if theOption
isNone
Boolean operators
These methods treat theOption
as a boolean value, where Some
acts like true
and None
acts like false
. There are two
categories of these methods: ones that take an Option
as input, and
ones that take a function as input (to be lazily evaluated).
The and
, or
, and xor
methods take another Option
as
input, and produce an Option
as output. Only the and
method can
produce an Option
value having a different inner type U
than
Option
.
method | self | input | output |
---|---|---|---|
and | None | (ignored) | None |
and | Some(x) | None | None |
and | Some(x) | Some(y) | Some(y) |
or | None | None | None |
or | None | Some(y) | Some(y) |
or | Some(x) | (ignored) | Some(x) |
xor | None | None | None |
xor | None | Some(y) | Some(y) |
xor | Some(x) | None | Some(x) |
xor | Some(x) | Some(y) | None |
and_then
and or_else
methods take a function as input, and
only evaluate the function when they need to produce a new value. Only
the and_then
method can produce an Option
value having a
different inner type U
than Option
.
method | self | function input | function result | output |
---|---|---|---|---|
and_then | None | (not provided) | (not evaluated) | None |
and_then | Some(x) | x | None | None |
and_then | Some(x) | x | Some(y) | Some(y) |
or_else | None | (not provided) | None | None |
or_else | None | (not provided) | Some(y) | Some(y) |
or_else | Some(x) | (not provided) | (not evaluated) | Some(x) |
Iterating over Option
An Option
can be iterated over. This can be helpful if you need an
iterator that is conditionally empty. The iterator will either produce
a single value (when the Option
is Some
), or produce no values
(when the Option
is None
). For example, into_iter
contains Some(v)
if the Option
is Some(v)
, and None
if the
Option
is None
.
Structs
OptionIter | An iterator over the value in the Some variant of an Option . The iterator yields one value if the Option is a… |
Enums
Option | The Option enum representing either Some(value) or None . |
Traits
OptionTrait | A trait for handling Option related operations. |
Impls
DestructOption | — |