Skip to main content

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 exactly None.

__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.