struct
Optional
A type modeling a value which may or may not be present.
Optional values can be thought of as a type-safe nullable pattern.
Your value can take on a value or None
, and you need to check
and explicitly extract the value to get it out.
Currently T is required to be a CollectionElement
so we can implement
copy/move for Optional and allow it to be used in collections itself.
from collections import Optional
var a = Optional(1)
var b = Optional[Int](None)
if a:
print(a.value()[]) # prints 1
if b: # bool(b) is False, so no print
print(b.value()[])
var c = a.or_else(2)
var d = b.or_else(2)
print(c) # prints 1
print(d) # prints 2
Parameters
- T (
CollectionElement
): The type of value stored in the Optional.
Implemented traits
AnyType
,
Boolable
,
CollectionElement
,
Copyable
,
Movable
Methods
__init__
__init__(inout self: Self, /)
Construct an empty Optional.
__init__(inout self: Self, /, owned value: T)
Construct an Optional containing a value.
Args:
- value (
T
): The value to store in the optional.
__init__(inout self: Self, /, value: None)
Construct an empty Optional.
Args:
- value (
None
): Must be exactlyNone
.
__bool__
__bool__(self: Self) -> Bool
Return true if the Optional has a value.
Returns:
True if the optional has a value and False otherwise.
__invert__
__invert__(self: Self) -> Bool
Return False if the optional has a value.
Returns:
False if the optional has a value and True otherwise.
__is__
__is__(self: Self, other: None) -> Bool
Return True
if the Optional has no value.
It allows you to use the following syntax: if my_optional is None:
Args:
- other (
None
): The value to compare to (None).
Returns:
True if the Optional has no value and False otherwise.
__isnot__
__isnot__(self: Self, other: None) -> Bool
Return True
if the Optional has a value.
It allows you to use the following syntax: if my_optional is not None:
.
Args:
- other (
None
): The value to compare to (None).
Returns:
True if the Optional has a value and False otherwise.
__and__
__and__[type: Boolable](self: Self, other: type) -> Bool
Return true if self has a value and the other value is coercible to True.
Parameters:
- type (
Boolable
): Type coercible to Bool.
Args:
- other (
type
): Value to compare to.
Returns:
True if both inputs are True after boolean coercion.
__or__
__or__[type: Boolable](self: Self, other: type) -> Bool
Return true if self has a value or the other value is coercible to True.
Parameters:
- type (
Boolable
): Type coercible to Bool.
Args:
- other (
type
): Value to compare to.
Returns:
True if either inputs is True after boolean coercion.
__rand__
__rand__[type: Boolable](self: Self, other: type) -> Bool
Return true if self has a value and the other value is coercible to True.
Parameters:
- type (
Boolable
): Type coercible to Bool.
Args:
- other (
type
): Value to compare to.
Returns:
True if both inputs are True after boolean coercion.
__ror__
__ror__[type: Boolable](self: Self, other: type) -> Bool
Return true if self has a value or the other value is coercible to True.
Parameters:
- type (
Boolable
): Type coercible to Bool.
Args:
- other (
type
): Value to compare to.
Returns:
True if either inputs is True after boolean coercion.
value
value[mutability: i1, self_life: lifetime<*(0,0)>](self: !lit.ref<_stdlib::_collections::_optional::_Optional<:trait<_stdlib::_builtin::_value::_CollectionElement> T>, mut=mutability, self_life>) -> Reference[T, $0, $1, 0]
Unsafely retrieve a reference to the value of the Optional.
This doesn't check to see if the optional contains a value.
If you call this without first verifying the optional with bool()
eg. by if my_option:
or without otherwise knowing that it contains a
value (for instance with or_else
), you'll get garbage unsafe data out.
Parameters:
- mutability (
i1
): Whether the Optional is mutable. - self_life (
lifetime<*(0,0)>
): The Optional's lifetime.
Returns:
A reference to the contained data of the option as a Reference[T].
take
take(owned self: Self) -> T
Unsafely move the value out of the Optional.
The caller takes ownership over the new value, and the Optional is destroyed.
This doesn't check to see if the optional contains a value.
If you call this without first verifying the optional with bool()
eg. by if my_option:
or without otherwise knowing that it contains a
value (for instance with or_else
), you'll get garbage unsafe data out.
Returns:
The contained data of the option as an owned T value.
or_else
or_else(self: Self, default: T) -> T
Return the underlying value contained in the Optional or a default value if the Optional's underlying value is not present.
Args:
- default (
T
): The new value to use if no value was present.
Returns:
The underlying value contained in the Optional or a default value.