diff options
Diffstat (limited to 'exercises/options')
| -rw-r--r-- | exercises/options/README.md | 20 | ||||
| -rw-r--r-- | exercises/options/options1.rs | 37 | ||||
| -rw-r--r-- | exercises/options/options2.rs | 25 | ||||
| -rw-r--r-- | exercises/options/options3.rs | 19 |
4 files changed, 101 insertions, 0 deletions
diff --git a/exercises/options/README.md b/exercises/options/README.md new file mode 100644 index 0000000..6140a16 --- /dev/null +++ b/exercises/options/README.md @@ -0,0 +1,20 @@ +# Options + +Type Option represents an optional value: every Option is either Some and contains a value, or None, and does not. +Option types are very common in Rust code, as they have a number of uses: +- Initial values +- Return values for functions that are not defined over their entire input range (partial functions) +- Return value for otherwise reporting simple errors, where None is returned on error +- Optional struct fields +- Struct fields that can be loaned or "taken" +- Optional function arguments +- Nullable pointers +- Swapping things out of difficult situations + +## Further Information + +- [Option Enum Format](https://doc.rust-lang.org/stable/book/ch10-01-syntax.html#in-enum-definitions) +- [Option Module Documentation](https://doc.rust-lang.org/std/option/) +- [Option Enum Documentation](https://doc.rust-lang.org/std/option/enum.Option.html) +- [if let](https://doc.rust-lang.org/rust-by-example/flow_control/if_let.html) +- [while let](https://doc.rust-lang.org/rust-by-example/flow_control/while_let.html) diff --git a/exercises/options/options1.rs b/exercises/options/options1.rs new file mode 100644 index 0000000..038fb48 --- /dev/null +++ b/exercises/options/options1.rs @@ -0,0 +1,37 @@ +// options1.rs +// Execute `rustlings hint options1` or use the `hint` watch subcommand for a hint. + +// I AM NOT DONE + +// you can modify anything EXCEPT for this function's signature +fn print_number(maybe_number: Option<u16>) { + println!("printing: {}", maybe_number.unwrap()); +} + +// This function returns how much icecream there is left in the fridge. +// If it's before 10PM, there's 5 pieces left. At 10PM, someone eats them +// all, so there'll be no more left :( +// TODO: Return an Option! +fn maybe_icecream(time_of_day: u16) -> Option<u16> { + // We use the 24-hour system here, so 10PM is a value of 22 + ??? +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn check_icecream() { + assert_eq!(maybe_icecream(10), Some(5)); + assert_eq!(maybe_icecream(23), None); + assert_eq!(maybe_icecream(22), None); + } + + #[test] + fn raw_value() { + // TODO: Fix this test. How do you get at the value contained in the Option? + let icecreams = maybe_icecream(12); + assert_eq!(icecreams, 5); + } +} diff --git a/exercises/options/options2.rs b/exercises/options/options2.rs new file mode 100644 index 0000000..75b66a3 --- /dev/null +++ b/exercises/options/options2.rs @@ -0,0 +1,25 @@ +// options2.rs +// Execute `rustlings hint options2` or use the `hint` watch subcommand for a hint. + +// I AM NOT DONE + +fn main() { + let optional_word = Some(String::from("rustlings")); + // TODO: Make this an if let statement whose value is "Some" type + word = optional_word { + println!("The word is: {}", word); + } else { + println!("The optional word doesn't contain anything"); + } + + let mut optional_integers_vec: Vec<Option<i8>> = Vec::new(); + for x in 1..10 { + optional_integers_vec.push(Some(x)); + } + + // TODO: make this a while let statement - remember that vector.pop also adds another layer of Option<T> + // You can stack `Option<T>`'s into while let and if let + integer = optional_integers_vec.pop() { + println!("current value: {}", integer); + } +} diff --git a/exercises/options/options3.rs b/exercises/options/options3.rs new file mode 100644 index 0000000..3f995c5 --- /dev/null +++ b/exercises/options/options3.rs @@ -0,0 +1,19 @@ +// options3.rs +// Execute `rustlings hint options3` or use the `hint` watch subcommand for a hint. + +// I AM NOT DONE + +struct Point { + x: i32, + y: i32, +} + +fn main() { + let y: Option<Point> = Some(Point { x: 100, y: 200 }); + + match y { + Some(p) => println!("Co-ordinates are {},{} ", p.x, p.y), + _ => println!("no match"), + } + y; // Fix without deleting this line. +} |
