Option
Recipe | Crates |
---|---|
Option | |
Adapters for working with references | |
Extracting the value contained in Option | |
Combinators |
TODO
Option
Rust has no null
. Instead, use std::option::Option
⮳:
#![allow(unused)] fn main() { enum Option<T> { None, Some(T), } }
Every std::option::Option
⮳ is either std::option::Option::Some
⮳ and contains a value, or std::option::Option::None
⮳, and does not.
#![allow(unused)] fn main() { let _some_number = Some(5); let absent_number: Option<i32> = None; println!("{:?}", absent_number); }
It is often used with match
⮳, if let
, or while let
:
fn bake_cake(sprinkles: Option<&str>) -> String { let mut cake = String::from("A delicious cake base..."); // Add required ingredients // Handle optional sprinkles if let Some(sprinkle_choice) = sprinkles { cake.push_str( format!(" with a sprinkle of {}", sprinkle_choice).as_str(), ); } else { // sprinkles is None cake.push_str(" ready for your decorating touch!"); } cake } fn main() { bake_cake(Some("rainbow nonpareils")); }
Adapters for working with references
std::convert::AsRef
⮳ converts from&Option<T>
toOption<&T>
std::convert::AsMut
⮳ converts from&mut Option<T>
toOption<&mut T>
std::option::Option::as_deref
⮳ converts from&Option<T>
toOption<&T::Target>
std::option::Option::as_deref_mut
⮳ converts from&mut Option<T>
toOption<&mut T::Target>
Extracting the value contained in Option
These methods extract the contained value in an std::option::Option
when it is the Some
variant. If the std::option::Option
⮳ is None
:
std::option::Option::expect
⮳ panics with a provided custom messagestd::option::Option::unwrap
⮳ panics with a generic messagestd::option::Option::unwrap_or
⮳ returns the provided default valuestd::option::Option::unwrap_or_default
⮳ returns the default value of the type T (which must implement thestd::default::Default
⮳ trait)std::option::Option::unwrap_or_else
⮳ returns the result of evaluating the provided function
Combinators
use std::fs; // `and_then` applies a function to the wrapped value if it's Some. fn read_file(filename: &str) -> Option<String> { fs::read_to_string(filename) .ok() // Convert `Result` to `Option` .and_then(|contents| Some(contents.trim().to_string())) // `and_then` chains operations on `Some` } fn main() { let contents = read_file("poem.txt"); // Using `match` to process the returned Option. match contents { Some(poem) => println!("{}", poem), None => println!("Error reading file"), } }
TODO: finish Option page map, unwrap_or