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)
}