Option<T>

Represents a value that may or may not be present. Joule's alternative to null pointers.

Variants

pub enum Option<T> {
    Some(T),    // a value is present
    None,       // no value
}

Construction

let some: Option<i32> = Option::Some(42);
let none: Option<i32> = Option::None;

Pattern Matching

The primary way to use an Option:

match value {
    Option::Some(x) => {
        // use x
        println!("Got: {}", x);
    }
    Option::None => {
        println!("Nothing");
    }
}

Common Methods

Checking

let has_value = opt.is_some();   // bool
let is_empty = opt.is_none();    // bool

Unwrapping

let value = opt.unwrap();              // panics if None
let value = opt.unwrap_or(default);    // returns default if None

Common Patterns

Lookup That May Fail

fn find(items: Vec<i32>, target: i32) -> Option<usize> {
    let mut i = 0;
    while i < items.len() {
        if items[i] == target {
            return Option::Some(i);
        }
        i = i + 1;
    }
    Option::None
}

Optional Fields

pub struct User {
    pub name: String,
    pub email: Option<String>,
}

Memory Layout

Option<T> {
    is_some: bool,    // discriminant
    value: T,         // the value (undefined when is_some == false)
}