mirror of
https://github.com/ahgamut/rust-ape-example.git
synced 2024-10-31 21:48:49 +00:00
89 lines
2.8 KiB
Rust
89 lines
2.8 KiB
Rust
|
// ./src/error/option_unwrap/defaults.md
|
||
|
|
||
|
|
||
|
#[derive(Debug)]
|
||
|
enum Fruit { Apple, Orange, Banana, Kiwi, Lemon }
|
||
|
|
||
|
fn part0() {
|
||
|
let apple = Some(Fruit::Apple);
|
||
|
let orange = Some(Fruit::Orange);
|
||
|
let no_fruit: Option<Fruit> = None;
|
||
|
|
||
|
let first_available_fruit = no_fruit.or(orange).or(apple);
|
||
|
println!("first_available_fruit: {:?}", first_available_fruit);
|
||
|
// first_available_fruit: Some(Orange)
|
||
|
|
||
|
// `or` moves its argument.
|
||
|
// In the example above, `or(orange)` returned a `Some`, so `or(apple)` was not invoked.
|
||
|
// But the variable named `apple` has been moved regardless, and cannot be used anymore.
|
||
|
// println!("Variable apple was moved, so this line won't compile: {:?}", apple);
|
||
|
// TODO: uncomment the line above to see the compiler error
|
||
|
}
|
||
|
|
||
|
|
||
|
fn part1() {
|
||
|
let apple = Some(Fruit::Apple);
|
||
|
let no_fruit: Option<Fruit> = None;
|
||
|
let get_kiwi_as_fallback = || {
|
||
|
println!("Providing kiwi as fallback");
|
||
|
Some(Fruit::Kiwi)
|
||
|
};
|
||
|
let get_lemon_as_fallback = || {
|
||
|
println!("Providing lemon as fallback");
|
||
|
Some(Fruit::Lemon)
|
||
|
};
|
||
|
|
||
|
let first_available_fruit = no_fruit
|
||
|
.or_else(get_kiwi_as_fallback)
|
||
|
.or_else(get_lemon_as_fallback);
|
||
|
println!("first_available_fruit: {:?}", first_available_fruit);
|
||
|
// Providing kiwi as fallback
|
||
|
// first_available_fruit: Some(Kiwi)
|
||
|
}
|
||
|
|
||
|
|
||
|
fn part2() {
|
||
|
let mut my_fruit: Option<Fruit> = None;
|
||
|
let apple = Fruit::Apple;
|
||
|
let first_available_fruit = my_fruit.get_or_insert(apple);
|
||
|
println!("my_fruit is: {:?}", first_available_fruit);
|
||
|
println!("first_available_fruit is: {:?}", first_available_fruit);
|
||
|
// my_fruit is: Apple
|
||
|
// first_available_fruit is: Apple
|
||
|
//println!("Variable named `apple` is moved: {:?}", apple);
|
||
|
// TODO: uncomment the line above to see the compiler error
|
||
|
}
|
||
|
|
||
|
|
||
|
fn part3() {
|
||
|
let mut my_fruit: Option<Fruit> = None;
|
||
|
let get_lemon_as_fallback = || {
|
||
|
println!("Providing lemon as fallback");
|
||
|
Fruit::Lemon
|
||
|
};
|
||
|
let first_available_fruit = my_fruit
|
||
|
.get_or_insert_with(get_lemon_as_fallback);
|
||
|
println!("my_fruit is: {:?}", first_available_fruit);
|
||
|
println!("first_available_fruit is: {:?}", first_available_fruit);
|
||
|
// Providing lemon as fallback
|
||
|
// my_fruit is: Lemon
|
||
|
// first_available_fruit is: Lemon
|
||
|
|
||
|
// If the Option has a value, it is left unchanged, and the closure is not invoked
|
||
|
let mut my_apple = Some(Fruit::Apple);
|
||
|
let should_be_apple = my_apple.get_or_insert_with(get_lemon_as_fallback);
|
||
|
println!("should_be_apple is: {:?}", should_be_apple);
|
||
|
println!("my_apple is unchanged: {:?}", my_apple);
|
||
|
// The output is a follows. Note that the closure `get_lemon_as_fallback` is not invoked
|
||
|
// should_be_apple is: Apple
|
||
|
// my_apple is unchanged: Some(Apple)
|
||
|
}
|
||
|
|
||
|
pub fn main() {
|
||
|
part0();
|
||
|
part1();
|
||
|
part2();
|
||
|
part3();
|
||
|
}
|
||
|
|