Enum Option

enum Option<T>

The Option type. See the module level documentation for more.

Variants

None

No value.

Some(T)

Some value of type T.

Implementations

impl<'a, T> Option<&'a Option<T>>

const fn flatten_ref(self: Self) -> Option<&'a T>

Converts from Option<&Option<T>> to Option<&T>.

Examples

Basic usage:

#![feature(option_reference_flattening)]

let x: Option<&Option<u32>> = Some(&Some(6));
assert_eq!(Some(&6), x.flatten_ref());

let x: Option<&Option<u32>> = Some(&None);
assert_eq!(None, x.flatten_ref());

let x: Option<&Option<u32>> = None;
assert_eq!(None, x.flatten_ref());

impl<'a, T> Option<&'a mut Option<T>>

const fn flatten_ref(self: Self) -> Option<&'a T>

Converts from Option<&mut Option<T>> to &Option<T>.

Examples

Basic usage:

#![feature(option_reference_flattening)]

let y = &mut Some(6);
let x: Option<&mut Option<u32>> = Some(y);
assert_eq!(Some(&6), x.flatten_ref());

let y: &mut Option<u32> = &mut None;
let x: Option<&mut Option<u32>> = Some(y);
assert_eq!(None, x.flatten_ref());

let x: Option<&mut Option<u32>> = None;
assert_eq!(None, x.flatten_ref());
const fn flatten_mut(self: Self) -> Option<&'a mut T>

Converts from Option<&mut Option<T>> to Option<&mut T>.

Examples

Basic usage:

#![feature(option_reference_flattening)]

let y: &mut Option<u32> = &mut Some(6);
let x: Option<&mut Option<u32>> = Some(y);
assert_eq!(Some(&mut 6), x.flatten_mut());

let y: &mut Option<u32> = &mut None;
let x: Option<&mut Option<u32>> = Some(y);
assert_eq!(None, x.flatten_mut());

let x: Option<&mut Option<u32>> = None;
assert_eq!(None, x.flatten_mut());

impl<T> Option<&T>

const fn copied(self: Self) -> Option<T>
where
    T: Copy

Maps an Option<&T> to an Option<T> by copying the contents of the option.

Examples

let x = 12;
let opt_x = Some(&x);
assert_eq!(opt_x, Some(&12));
let copied = opt_x.copied();
assert_eq!(copied, Some(12));
fn cloned(self: Self) -> Option<T>
where
    T: Clone

Maps an Option<&T> to an Option<T> by cloning the contents of the option.

Examples

let x = 12;
let opt_x = Some(&x);
assert_eq!(opt_x, Some(&12));
let cloned = opt_x.cloned();
assert_eq!(cloned, Some(12));

impl<T> Option<&mut T>

const fn copied(self: Self) -> Option<T>
where
    T: Copy

Maps an Option<&mut T> to an Option<T> by copying the contents of the option.

Examples

let mut x = 12;
let opt_x = Some(&mut x);
assert_eq!(opt_x, Some(&mut 12));
let copied = opt_x.copied();
assert_eq!(copied, Some(12));
fn cloned(self: Self) -> Option<T>
where
    T: Clone

Maps an Option<&mut T> to an Option<T> by cloning the contents of the option.

Examples

let mut x = 12;
let opt_x = Some(&mut x);
assert_eq!(opt_x, Some(&mut 12));
let cloned = opt_x.cloned();
assert_eq!(cloned, Some(12));

impl<T> Option<Option<T>>

const fn flatten(self: Self) -> Option<T>

Converts from Option<Option<T>> to Option<T>.

Examples

Basic usage:

let x: Option<Option<u32>> = Some(Some(6));
assert_eq!(Some(6), x.flatten());

let x: Option<Option<u32>> = Some(None);
assert_eq!(None, x.flatten());

let x: Option<Option<u32>> = None;
assert_eq!(None, x.flatten());

Flattening only removes one level of nesting at a time:

let x: Option<Option<Option<u32>>> = Some(Some(Some(6)));
assert_eq!(Some(Some(6)), x.flatten());
assert_eq!(Some(6), x.flatten().flatten());

impl<T> Option<T>

const fn is_some(self: &Self) -> bool

Returns true if the option is a Some value.

Examples

let x: Option<u32> = Some(2);
assert_eq!(x.is_some(), true);

let x: Option<u32> = None;
assert_eq!(x.is_some(), false);
const fn is_some_and<impl [const] FnOnce(T) -> bool + [const] Destruct: ~const FnOnce(T) -> bool>(self: Self, f: impl ~const FnOnce(T) -> bool) -> bool

Returns true if the option is a Some and the value inside of it matches a predicate.

Examples

let x: Option<u32> = Some(2);
assert_eq!(x.is_some_and(|x| x > 1), true);

let x: Option<u32> = Some(0);
assert_eq!(x.is_some_and(|x| x > 1), false);

let x: Option<u32> = None;
assert_eq!(x.is_some_and(|x| x > 1), false);

let x: Option<String> = Some("ownership".to_string());
assert_eq!(x.as_ref().is_some_and(|x| x.len() > 1), true);
println!("still alive {:?}", x);
const fn is_none(self: &Self) -> bool

Returns true if the option is a None value.

Examples

let x: Option<u32> = Some(2);
assert_eq!(x.is_none(), false);

let x: Option<u32> = None;
assert_eq!(x.is_none(), true);
const fn is_none_or<impl [const] FnOnce(T) -> bool + [const] Destruct: ~const FnOnce(T) -> bool>(self: Self, f: impl ~const FnOnce(T) -> bool) -> bool

Returns true if the option is a None or the value inside of it matches a predicate.

Examples

let x: Option<u32> = Some(2);
assert_eq!(x.is_none_or(|x| x > 1), true);

let x: Option<u32> = Some(0);
assert_eq!(x.is_none_or(|x| x > 1), false);

let x: Option<u32> = None;
assert_eq!(x.is_none_or(|x| x > 1), true);

let x: Option<String> = Some("ownership".to_string());
assert_eq!(x.as_ref().is_none_or(|x| x.len() > 1), true);
println!("still alive {:?}", x);
const fn as_ref(self: &Self) -> Option<&T>

Converts from &Option<T> to Option<&T>.

Examples

Calculates the length of an Option<String> as an Option<[usize]> without moving the String. The map method takes the self argument by value, consuming the original, so this technique uses as_ref to first take an Option to a reference to the value inside the original.

let text: Option<String> = Some("Hello, world!".to_string());
// First, cast `Option<String>` to `Option<&String>` with `as_ref`,
// then consume *that* with `map`, leaving `text` on the stack.
let text_length: Option<usize> = text.as_ref().map(|s| s.len());
println!("still can print text: {text:?}");
const fn as_mut(self: &mut Self) -> Option<&mut T>

Converts from &mut Option<T> to Option<&mut T>.

Examples

let mut x = Some(2);
match x.as_mut() {
    Some(v) => *v = 42,
    None => {},
}
assert_eq!(x, Some(42));
const fn as_pin_ref(self: Pin<&Self>) -> Option<Pin<&T>>

Converts from [Pin]<&Option<T>> to Option<[Pin]<&T>>.

const fn as_pin_mut(self: Pin<&mut Self>) -> Option<Pin<&mut T>>

Converts from [Pin]<&mut Option<T>> to Option<[Pin]<&mut T>>.

const fn as_slice(self: &Self) -> &[T]

Returns a slice of the contained value, if any. If this is None, an empty slice is returned. This can be useful to have a single type of iterator over an Option or slice.

Note: Should you have an Option<&T> and wish to get a slice of T, you can unpack it via opt.map_or(&[], std::slice::from_ref).

Examples

assert_eq!(
    [Some(1234).as_slice(), None.as_slice()],
    [&[1234][..], &[][..]],
);

The inverse of this function is (discounting borrowing) [_]::first:

for i in [Some(1234_u16), None] {
    assert_eq!(i.as_ref(), i.as_slice().first());
}
const fn as_mut_slice(self: &mut Self) -> &mut [T]

Returns a mutable slice of the contained value, if any. If this is None, an empty slice is returned. This can be useful to have a single type of iterator over an Option or slice.

Note: Should you have an Option<&mut T> instead of a &mut Option<T>, which this method takes, you can obtain a mutable slice via opt.map_or(&mut [], std::slice::from_mut).

Examples

assert_eq!(
    [Some(1234).as_mut_slice(), None.as_mut_slice()],
    [&mut [1234][..], &mut [][..]],
);

The result is a mutable slice of zero or one items that points into our original Option:

let mut x = Some(1234);
x.as_mut_slice()[0] += 1;
assert_eq!(x, Some(1235));

The inverse of this method (discounting borrowing) is [_]::first_mut:

assert_eq!(Some(123).as_mut_slice().first_mut(), Some(&mut 123))
const fn expect(self: Self, msg: &str) -> T

Returns the contained Some value, consuming the self value.

Panics

Panics if the value is a None with a custom panic message provided by msg.

Examples

let x = Some("value");
assert_eq!(x.expect("fruits are healthy"), "value");
let x: Option<&str> = None;
x.expect("fruits are healthy"); // panics with `fruits are healthy`

Recommended Message Style

We recommend that expect messages are used to describe the reason you expect the Option should be Some.

# let slice: &[u8] = &[];
let item = slice.get(0)
    .expect("slice should not be empty");

Hint: If you're having trouble remembering how to phrase expect error messages remember to focus on the word "should" as in "env variable should be set by blah" or "the given binary should be available and executable by the current user".

For more detail on expect message styles and the reasoning behind our recommendation please refer to the section on "Common Message Styles" in the std::error module docs.

const fn unwrap(self: Self) -> T

Returns the contained Some value, consuming the self value.

Because this function may panic, its use is generally discouraged. Panics are meant for unrecoverable errors, and may abort the entire program.

Instead, prefer to use pattern matching and handle the None case explicitly, or call unwrap_or, unwrap_or_else, or unwrap_or_default. In functions returning Option, you can use the ? (try) operator.

Panics

Panics if the self value equals None.

Examples

let x = Some("air");
assert_eq!(x.unwrap(), "air");
let x: Option<&str> = None;
assert_eq!(x.unwrap(), "air"); // fails
const fn unwrap_or(self: Self, default: T) -> T
where
    T: 

Returns the contained Some value or a provided default.

Arguments passed to unwrap_or are eagerly evaluated; if you are passing the result of a function call, it is recommended to use unwrap_or_else, which is lazily evaluated.

Examples

assert_eq!(Some("car").unwrap_or("bike"), "car");
assert_eq!(None.unwrap_or("bike"), "bike");
const fn unwrap_or_else<F>(self: Self, f: F) -> T
where
    F: ~const FnOnce() -> T

Returns the contained Some value or computes it from a closure.

Examples

let k = 10;
assert_eq!(Some(4).unwrap_or_else(|| 2 * k), 4);
assert_eq!(None.unwrap_or_else(|| 2 * k), 20);
const fn unwrap_or_default(self: Self) -> T
where
    T: ~const Default

Returns the contained Some value or a default.

Consumes the self argument then, if Some, returns the contained value, otherwise if None, returns the default value for that type.

Examples

let x: Option<u32> = None;
let y: Option<u32> = Some(12);

assert_eq!(x.unwrap_or_default(), 0);
assert_eq!(y.unwrap_or_default(), 12);
unsafe const fn unwrap_unchecked(self: Self) -> T

Returns the contained Some value, consuming the self value, without checking that the value is not None.

Safety

Calling this method on None is undefined behavior.

Examples

let x = Some("air");
assert_eq!(unsafe { x.unwrap_unchecked() }, "air");
let x: Option<&str> = None;
assert_eq!(unsafe { x.unwrap_unchecked() }, "air"); // Undefined behavior!
const fn map<U, F>(self: Self, f: F) -> Option<U>
where
    F: ~const FnOnce(T) -> U

Maps an Option<T> to Option<U> by applying a function to a contained value (if Some) or returns None (if None).

Examples

Calculates the length of an Option<String> as an Option<[usize]>, consuming the original:

let maybe_some_string = Some(String::from("Hello, World!"));
// `Option::map` takes self *by value*, consuming `maybe_some_string`
let maybe_some_len = maybe_some_string.map(|s| s.len());
assert_eq!(maybe_some_len, Some(13));

let x: Option<&str> = None;
assert_eq!(x.map(|s| s.len()), None);
const fn inspect<F>(self: Self, f: F) -> Self
where
    F: ~const FnOnce(&T)

Calls a function with a reference to the contained value if Some.

Returns the original option.

Examples

let list = vec![1, 2, 3];

// prints "got: 2"
let x = list
    .get(1)
    .inspect(|x| println!("got: {x}"))
    .expect("list should be long enough");

// prints nothing
list.get(5).inspect(|x| println!("got: {x}"));
const fn map_or<U, F>(self: Self, default: U, f: F) -> U
where
    F: ~const FnOnce(T) -> U,
    U: 

Returns the provided default result (if none), or applies a function to the contained value (if any).

Arguments passed to map_or are eagerly evaluated; if you are passing the result of a function call, it is recommended to use map_or_else, which is lazily evaluated.

Examples

let x = Some("foo");
assert_eq!(x.map_or(42, |v| v.len()), 3);

let x: Option<&str> = None;
assert_eq!(x.map_or(42, |v| v.len()), 42);
const fn map_or_else<U, D, F>(self: Self, default: D, f: F) -> U
where
    D: ~const FnOnce() -> U,
    F: ~const FnOnce(T) -> U

Computes a default function result (if none), or applies a different function to the contained value (if any).

Basic examples

let k = 21;

let x = Some("foo");
assert_eq!(x.map_or_else(|| 2 * k, |v| v.len()), 3);

let x: Option<&str> = None;
assert_eq!(x.map_or_else(|| 2 * k, |v| v.len()), 42);

Handling a Result-based fallback

A somewhat common occurrence when dealing with optional values in combination with [Result<T, E>] is the case where one wants to invoke a fallible fallback if the option is not present. This example parses a command line argument (if present), or the contents of a file to an integer. However, unlike accessing the command line argument, reading the file is fallible, so it must be wrapped with Ok.

# fn main() -> Result<(), Box<dyn std::error::Error>> {
let v: u64 = std::env::args()
   .nth(1)
   .map_or_else(|| std::fs::read_to_string("/etc/someconfig.conf"), Ok)?
   .parse()?;
#   Ok(())
# }
const fn map_or_default<U, F>(self: Self, f: F) -> U
where
    U: ~const Default,
    F: ~const FnOnce(T) -> U

Maps an Option<T> to a U by applying function f to the contained value if the option is Some, otherwise if None, returns the default value for the type U.

Examples

#![feature(result_option_map_or_default)]

let x: Option<&str> = Some("hi");
let y: Option<&str> = None;

assert_eq!(x.map_or_default(|x| x.len()), 2);
assert_eq!(y.map_or_default(|y| y.len()), 0);
const fn ok_or<E>(self: Self, err: E) -> Result<T, E>

Transforms the Option<T> into a [Result<T, E>], mapping Some(v) to Ok(v) and None to Err(err).

Arguments passed to ok_or are eagerly evaluated; if you are passing the result of a function call, it is recommended to use ok_or_else, which is lazily evaluated.

Examples

let x = Some("foo");
assert_eq!(x.ok_or(0), Ok("foo"));

let x: Option<&str> = None;
assert_eq!(x.ok_or(0), Err(0));
const fn ok_or_else<E, F>(self: Self, err: F) -> Result<T, E>
where
    F: ~const FnOnce() -> E

Transforms the Option<T> into a [Result<T, E>], mapping Some(v) to Ok(v) and None to Err(err()).

Examples

let x = Some("foo");
assert_eq!(x.ok_or_else(|| 0), Ok("foo"));

let x: Option<&str> = None;
assert_eq!(x.ok_or_else(|| 0), Err(0));
const fn as_deref(self: &Self) -> Option<&<T as >::Target>
where
    T: ~const Deref

Converts from Option<T> (or &Option<T>) to Option<&T::Target>.

Leaves the original Option in-place, creating a new one with a reference to the original one, additionally coercing the contents via Deref.

Examples

let x: Option<String> = Some("hey".to_owned());
assert_eq!(x.as_deref(), Some("hey"));

let x: Option<String> = None;
assert_eq!(x.as_deref(), None);
const fn as_deref_mut(self: &mut Self) -> Option<&mut <T as >::Target>
where
    T: ~const DerefMut

Converts from Option<T> (or &mut Option<T>) to Option<&mut T::Target>.

Leaves the original Option in-place, creating a new one containing a mutable reference to the inner type's Deref::Target type.

Examples

let mut x: Option<String> = Some("hey".to_owned());
assert_eq!(x.as_deref_mut().map(|x| {
    x.make_ascii_uppercase();
    x
}), Some("HEY".to_owned().as_mut_str()));
fn iter(self: &Self) -> Iter<'_, T>

Returns an iterator over the possibly contained value.

Examples

let x = Some(4);
assert_eq!(x.iter().next(), Some(&4));

let x: Option<u32> = None;
assert_eq!(x.iter().next(), None);
fn iter_mut(self: &mut Self) -> IterMut<'_, T>

Returns a mutable iterator over the possibly contained value.

Examples

let mut x = Some(4);
match x.iter_mut().next() {
    Some(v) => *v = 42,
    None => {},
}
assert_eq!(x, Some(42));

let mut x: Option<u32> = None;
assert_eq!(x.iter_mut().next(), None);
const fn and<U>(self: Self, optb: Option<U>) -> Option<U>
where
    T: ,
    U: 

Returns None if the option is None, otherwise returns optb.

Arguments passed to and are eagerly evaluated; if you are passing the result of a function call, it is recommended to use and_then, which is lazily evaluated.

Examples

let x = Some(2);
let y: Option<&str> = None;
assert_eq!(x.and(y), None);

let x: Option<u32> = None;
let y = Some("foo");
assert_eq!(x.and(y), None);

let x = Some(2);
let y = Some("foo");
assert_eq!(x.and(y), Some("foo"));

let x: Option<u32> = None;
let y: Option<&str> = None;
assert_eq!(x.and(y), None);
const fn and_then<U, F>(self: Self, f: F) -> Option<U>
where
    F: ~const FnOnce(T) -> Option<U>

Returns None if the option is None, otherwise calls f with the wrapped value and returns the result.

Some languages call this operation flatmap.

Examples

fn sq_then_to_string(x: u32) -> Option<String> {
    x.checked_mul(x).map(|sq| sq.to_string())
}

assert_eq!(Some(2).and_then(sq_then_to_string), Some(4.to_string()));
assert_eq!(Some(1_000_000).and_then(sq_then_to_string), None); // overflowed!
assert_eq!(None.and_then(sq_then_to_string), None);

Often used to chain fallible operations that may return None.

let arr_2d = [["A0", "A1"], ["B0", "B1"]];

let item_0_1 = arr_2d.get(0).and_then(|row| row.get(1));
assert_eq!(item_0_1, Some(&"A1"));

let item_2_0 = arr_2d.get(2).and_then(|row| row.get(0));
assert_eq!(item_2_0, None);
const fn filter<P>(self: Self, predicate: P) -> Self
where
    P: ~const FnOnce(&T) -> bool,
    T: 

Returns None if the option is None, otherwise calls predicate with the wrapped value and returns:

  • Some(t) if predicate returns true (where t is the wrapped value), and
  • None if predicate returns false.

This function works similar to [Iterator::filter()]. You can imagine the Option<T> being an iterator over one or zero elements. filter() lets you decide which elements to keep.

Examples

fn is_even(n: &i32) -> bool {
    n % 2 == 0
}

assert_eq!(None.filter(is_even), None);
assert_eq!(Some(3).filter(is_even), None);
assert_eq!(Some(4).filter(is_even), Some(4));
const fn or(self: Self, optb: Option<T>) -> Option<T>
where
    T: 

Returns the option if it contains a value, otherwise returns optb.

Arguments passed to or are eagerly evaluated; if you are passing the result of a function call, it is recommended to use or_else, which is lazily evaluated.

Examples

let x = Some(2);
let y = None;
assert_eq!(x.or(y), Some(2));

let x = None;
let y = Some(100);
assert_eq!(x.or(y), Some(100));

let x = Some(2);
let y = Some(100);
assert_eq!(x.or(y), Some(2));

let x: Option<u32> = None;
let y = None;
assert_eq!(x.or(y), None);
const fn or_else<F>(self: Self, f: F) -> Option<T>
where
    F: ~const FnOnce() -> Option<T>,
    T: 

Returns the option if it contains a value, otherwise calls f and returns the result.

Examples

fn nobody() -> Option<&'static str> { None }
fn vikings() -> Option<&'static str> { Some("vikings") }

assert_eq!(Some("barbarians").or_else(vikings), Some("barbarians"));
assert_eq!(None.or_else(vikings), Some("vikings"));
assert_eq!(None.or_else(nobody), None);
const fn xor(self: Self, optb: Option<T>) -> Option<T>
where
    T: 

Returns Some if exactly one of self, optb is Some, otherwise returns None.

Examples

let x = Some(2);
let y: Option<u32> = None;
assert_eq!(x.xor(y), Some(2));

let x: Option<u32> = None;
let y = Some(2);
assert_eq!(x.xor(y), Some(2));

let x = Some(2);
let y = Some(2);
assert_eq!(x.xor(y), None);

let x: Option<u32> = None;
let y: Option<u32> = None;
assert_eq!(x.xor(y), None);
const fn insert(self: &mut Self, value: T) -> &mut T
where
    T: 

Inserts value into the option, then returns a mutable reference to it.

If the option already contains a value, the old value is dropped.

See also Option::get_or_insert, which doesn't update the value if the option already contains Some.

Example

let mut opt = None;
let val = opt.insert(1);
assert_eq!(*val, 1);
assert_eq!(opt.unwrap(), 1);
let val = opt.insert(2);
assert_eq!(*val, 2);
*val = 3;
assert_eq!(opt.unwrap(), 3);
fn get_or_insert(self: &mut Self, value: T) -> &mut T

Inserts value into the option if it is None, then returns a mutable reference to the contained value.

See also Option::insert, which updates the value even if the option already contains Some.

Examples

let mut x = None;

{
    let y: &mut u32 = x.get_or_insert(5);
    assert_eq!(y, &5);

    *y = 7;
}

assert_eq!(x, Some(7));
const fn get_or_insert_default(self: &mut Self) -> &mut T
where
    T: ~const Default

Inserts the default value into the option if it is None, then returns a mutable reference to the contained value.

Examples

let mut x = None;

{
    let y: &mut u32 = x.get_or_insert_default();
    assert_eq!(y, &0);

    *y = 7;
}

assert_eq!(x, Some(7));
const fn get_or_insert_with<F>(self: &mut Self, f: F) -> &mut T
where
    F: ~const FnOnce() -> T,
    T: 

Inserts a value computed from f into the option if it is None, then returns a mutable reference to the contained value.

Examples

let mut x = None;

{
    let y: &mut u32 = x.get_or_insert_with(|| 5);
    assert_eq!(y, &5);

    *y = 7;
}

assert_eq!(x, Some(7));
const fn take(self: &mut Self) -> Option<T>

Takes the value out of the option, leaving a None in its place.

Examples

let mut x = Some(2);
let y = x.take();
assert_eq!(x, None);
assert_eq!(y, Some(2));

let mut x: Option<u32> = None;
let y = x.take();
assert_eq!(x, None);
assert_eq!(y, None);
const fn take_if<P>(self: &mut Self, predicate: P) -> Option<T>
where
    P: ~const FnOnce(&mut T) -> bool

Takes the value out of the option, but only if the predicate evaluates to true on a mutable reference to the value.

In other words, replaces self with None if the predicate returns true. This method operates similar to Option::take but conditional.

Examples

let mut x = Some(42);

let prev = x.take_if(|v| if *v == 42 {
    *v += 1;
    false
} else {
    false
});
assert_eq!(x, Some(43));
assert_eq!(prev, None);

let prev = x.take_if(|v| *v == 43);
assert_eq!(x, None);
assert_eq!(prev, Some(43));
const fn replace(self: &mut Self, value: T) -> Option<T>

Replaces the actual value in the option by the value given in parameter, returning the old value if present, leaving a Some in its place without deinitializing either one.

Examples

let mut x = Some(2);
let old = x.replace(5);
assert_eq!(x, Some(5));
assert_eq!(old, Some(2));

let mut x = None;
let old = x.replace(3);
assert_eq!(x, Some(3));
assert_eq!(old, None);
const fn zip<U>(self: Self, other: Option<U>) -> Option<(T, U)>
where
    T: ,
    U: 

Zips self with another Option.

If self is Some(s) and other is Some(o), this method returns Some((s, o)). Otherwise, None is returned.

Examples

let x = Some(1);
let y = Some("hi");
let z = None::<u8>;

assert_eq!(x.zip(y), Some((1, "hi")));
assert_eq!(x.zip(z), None);
const fn zip_with<U, F, R>(self: Self, other: Option<U>, f: F) -> Option<R>
where
    F: ~const FnOnce(T, U) -> R,
    T: ,
    U: 

Zips self and another Option with function f.

If self is Some(s) and other is Some(o), this method returns Some(f(s, o)). Otherwise, None is returned.

Examples

#![feature(option_zip)]

#[derive(Debug, PartialEq)]
struct Point {
    x: f64,
    y: f64,
}

impl Point {
    fn new(x: f64, y: f64) -> Self {
        Self { x, y }
    }
}

let x = Some(17.5);
let y = Some(42.7);

assert_eq!(x.zip_with(y, Point::new), Some(Point { x: 17.5, y: 42.7 }));
assert_eq!(x.zip_with(None, Point::new), None);
fn reduce<U, R, F>(self: Self, other: Option<U>, f: F) -> Option<R>
where
    T: Into<R>,
    U: Into<R>,
    F: FnOnce(T, U) -> R

Reduces two options into one, using the provided function if both are Some.

If self is Some(s) and other is Some(o), this method returns Some(f(s, o)). Otherwise, if only one of self and other is Some, that one is returned. If both self and other are None, None is returned.

Examples

#![feature(option_reduce)]

let s12 = Some(12);
let s17 = Some(17);
let n = None;
let f = |a, b| a + b;

assert_eq!(s12.reduce(s17, f), Some(29));
assert_eq!(s12.reduce(n, f), Some(12));
assert_eq!(n.reduce(s17, f), Some(17));
assert_eq!(n.reduce(n, f), None);

impl<T, E> Option<Result<T, E>>

const fn transpose(self: Self) -> Result<Option<T>, E>

Transposes an Option of a Result into a Result of an Option.

[Some]([Ok](_)) is mapped to [Ok]([Some](_)), [Some]([Err](_)) is mapped to [Err](_), and None will be mapped to [Ok]([None]).

Examples

#[derive(Debug, Eq, PartialEq)]
struct SomeErr;

let x: Option<Result<i32, SomeErr>> = Some(Ok(5));
let y: Result<Option<i32>, SomeErr> = Ok(Some(5));
assert_eq!(x.transpose(), y);

impl<T, U> Option<(T, U)>

fn unzip(self: Self) -> (Option<T>, Option<U>)

Unzips an option containing a tuple of two options.

If self is Some((a, b)) this method returns (Some(a), Some(b)). Otherwise, (None, None) is returned.

Examples

let x = Some((1, "hi"));
let y = None::<(u8, u32)>;

assert_eq!(x.unzip(), (Some(1), Some("hi")));
assert_eq!(y.unzip(), (None, None));

impl<T: IntoIterator> Option<T>

fn into_flat_iter<A>(self: Self) -> OptionFlatten<A>
where
    T: IntoIterator<IntoIter = A>

Transforms an optional iterator into an iterator.

If self is None, the resulting iterator is empty. Otherwise, an iterator is made from the Some value and returned.

Examples

#![feature(option_into_flat_iter)]

let o1 = Some([1, 2]);
let o2 = None::<&[usize]>;

assert_eq!(o1.into_flat_iter().collect::<Vec<_>>(), [1, 2]);
assert_eq!(o2.into_flat_iter().collect::<Vec<_>>(), Vec::<&usize>::new());

impl<'a, T> From for Option<&'a T>

fn from(o: &'a Option<T>) -> Option<&'a T>

Converts from &Option<T> to Option<&T>.

Examples

Converts an [Option]<String> into an [Option]<[usize]>, preserving the original. The map method takes the self argument by value, consuming the original, so this technique uses from to first take an Option to a reference to the value inside the original.

let s: Option<String> = Some(String::from("Hello, Rustaceans!"));
let o: Option<usize> = Option::from(&s).map(|ss: &String| ss.len());

println!("Can still print s: {s:?}");

assert_eq!(o, Some(18));

impl<'a, T> From for Option<&'a mut T>

fn from(o: &'a mut Option<T>) -> Option<&'a mut T>

Converts from &mut Option<T> to Option<&mut T>

Examples

let mut s = Some(String::from("Hello"));
let o: Option<&mut String> = Option::from(&mut s);

match o {
    Some(t) => *t = String::from("Hello, Rustaceans!"),
    None => (),
}

assert_eq!(s, Some(String::from("Hello, Rustaceans!")));

impl<A, V: FromIterator<A>> FromIterator for Option<V>

fn from_iter<I: IntoIterator<Item = Option<A>>>(iter: I) -> Option<V>

Takes each element in the [Iterator]: if it is [None][Option::None], no further elements are taken, and the [None][Option::None] is returned. Should no [None][Option::None] occur, a container of type V containing the values of each Option is returned.

Examples

Here is an example which increments every integer in a vector. We use the checked variant of add that returns None when the calculation would result in an overflow.

let items = vec![0_u16, 1, 2];

let res: Option<Vec<u16>> = items
    .iter()
    .map(|x| x.checked_add(1))
    .collect();

assert_eq!(res, Some(vec![1, 2, 3]));

As you can see, this will return the expected, valid items.

Here is another example that tries to subtract one from another list of integers, this time checking for underflow:

let items = vec![2_u16, 1, 0];

let res: Option<Vec<u16>> = items
    .iter()
    .map(|x| x.checked_sub(1))
    .collect();

assert_eq!(res, None);

Since the last element is zero, it would underflow. Thus, the resulting value is None.

Here is a variation on the previous example, showing that no further elements are taken from iter after the first None.

let items = vec![3_u16, 2, 1, 10];

let mut shared = 0;

let res: Option<Vec<u16>> = items
    .iter()
    .map(|x| { shared += x; x.checked_sub(2) })
    .collect();

assert_eq!(res, None);
assert_eq!(shared, 6);

Since the third element caused an underflow, no further elements were taken, so the final value of shared is 6 (= 3 + 2 + 1), not 16.

impl<T> Any for Option<T>

fn type_id(self: &Self) -> TypeId

impl<T> Borrow for Option<T>

fn borrow(self: &Self) -> &T

impl<T> BorrowMut for Option<T>

fn borrow_mut(self: &mut Self) -> &mut T

impl<T> Clone for Option<T>

fn clone(self: &Self) -> Self
fn clone_from(self: &mut Self, source: &Self)

impl<T> CloneToUninit for Option<T>

unsafe fn clone_to_uninit(self: &Self, dest: *mut u8)

impl<T> Default for Option<T>

fn default() -> Option<T>

Returns [None][Option::None].

Examples

let opt: Option<u32> = Option::default();
assert!(opt.is_none());

impl<T> Freeze for Option<T>

impl<T> From for Option<T>

fn from(t: T) -> T

Returns the argument unchanged.

impl<T> From for Option<T>

fn from(t: never) -> T

impl<T> From for Option<T>

fn from(val: T) -> Option<T>

Moves val into a new Some.

Examples

let o: Option<u8> = Option::from(67);

assert_eq!(Some(67), o);

impl<T> FromResidual for Option<T>

fn from_residual(ops::Yeet: ops::Yeet<()>) -> Self

impl<T> FromResidual for Option<T>

fn from_residual(residual: Option<convert::Infallible>) -> Self

impl<T> IntoIterator for Option<T>

fn into_iter(self: Self) -> IntoIter<T>

Returns a consuming iterator over the possibly contained value.

Examples

let x = Some("string");
let v: Vec<&str> = x.into_iter().collect();
assert_eq!(v, ["string"]);

let x = None;
let v: Vec<&str> = x.into_iter().collect();
assert!(v.is_empty());

impl<T> RefUnwindSafe for Option<T>

impl<T> Residual for Option<convert::Infallible>

impl<T> Send for Option<T>

impl<T> StructuralPartialEq for Option<T>

impl<T> Sync for Option<T>

impl<T> Try for Option<T>

fn from_output(output: <Self as >::Output) -> Self
fn branch(self: Self) -> ControlFlow<<Self as >::Residual, <Self as >::Output>

impl<T> Unpin for Option<T>

impl<T> UnwindSafe for Option<T>

impl<T> UseCloned for Option<T>

impl<T, U> Into for Option<T>

fn into(self: Self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of [From]<T> for U chooses to do.

impl<T, U> Product for Option<T>

fn product<I>(iter: I) -> Option<T>
where
    I: Iterator<Item = Option<U>>

Takes each element in the [Iterator]: if it is a None, no further elements are taken, and the None is returned. Should no None occur, the product of all elements is returned.

Examples

This multiplies each number in a vector of strings, if a string could not be parsed the operation returns None:

let nums = vec!["5", "10", "1", "2"];
let total: Option<usize> = nums.iter().map(|w| w.parse::<usize>().ok()).product();
assert_eq!(total, Some(100));
let nums = vec!["5", "10", "one", "2"];
let total: Option<usize> = nums.iter().map(|w| w.parse::<usize>().ok()).product();
assert_eq!(total, None);

impl<T, U> Sum for Option<T>

fn sum<I>(iter: I) -> Option<T>
where
    I: Iterator<Item = Option<U>>

Takes each element in the [Iterator]: if it is a None, no further elements are taken, and the None is returned. Should no None occur, the sum of all elements is returned.

Examples

This sums up the position of the character 'a' in a vector of strings, if a word did not have the character 'a' the operation returns None:

let words = vec!["have", "a", "great", "day"];
let total: Option<usize> = words.iter().map(|w| w.find('a')).sum();
assert_eq!(total, Some(5));
let words = vec!["have", "a", "good", "day"];
let total: Option<usize> = words.iter().map(|w| w.find('a')).sum();
assert_eq!(total, None);

impl<T, U> TryFrom for Option<T>

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

impl<T, U> TryInto for Option<T>

fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error>

impl<T: $crate::fmt::Debug> Debug for Option<T>

fn fmt(self: &Self, f: &mut $crate::fmt::Formatter<'_>) -> $crate::fmt::Result

impl<T: $crate::hash::Hash> Hash for Option<T>

fn hash<__H: $crate::hash::Hasher>(self: &Self, state: &mut __H)

impl<T: $crate::marker::Copy> Copy for Option<T>

impl<T: CloneFromCell> CloneFromCell for Option<T>

impl<T: ~const $crate::cmp::Eq> Eq for Option<T>

impl<T: ~const Ord> Ord for Option<T>

fn cmp(self: &Self, other: &Self) -> cmp::Ordering

impl<T: ~const PartialEq> PartialEq for Option<T>

fn eq(self: &Self, other: &Self) -> bool

impl<T: ~const PartialOrd> PartialOrd for Option<T>

fn partial_cmp(self: &Self, other: &Self) -> Option<cmp::Ordering>