summaryrefslogtreecommitdiff
path: root/exercises/12_options
diff options
context:
space:
mode:
authorAdam Brewer <adamhb321@gmail.com>2023-10-16 07:37:12 -0400
committerAdam Brewer <adamhb321@gmail.com>2023-10-16 07:37:12 -0400
commit64d95837e9813541cf5b357de13865ce687ae98d (patch)
treef022c5d5ba01128811c0b77618a7adb843ee876b /exercises/12_options
parentc3941323e2c0b9ee286494327de92e00f23b9e3a (diff)
Update Exercises Directory Names to Reflect Order
Diffstat (limited to 'exercises/12_options')
-rw-r--r--exercises/12_options/README.md21
-rw-r--r--exercises/12_options/options1.rs39
-rw-r--r--exercises/12_options/options2.rs42
-rw-r--r--exercises/12_options/options3.rs21
4 files changed, 123 insertions, 0 deletions
diff --git a/exercises/12_options/README.md b/exercises/12_options/README.md
new file mode 100644
index 0000000..bdd3374
--- /dev/null
+++ b/exercises/12_options/README.md
@@ -0,0 +1,21 @@
+# 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/12_options/options1.rs b/exercises/12_options/options1.rs
new file mode 100644
index 0000000..e131b48
--- /dev/null
+++ b/exercises/12_options/options1.rs
@@ -0,0 +1,39 @@
+// options1.rs
+//
+// Execute `rustlings hint options1` or use the `hint` watch subcommand for a
+// hint.
+
+// I AM NOT DONE
+
+// 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 :(
+fn maybe_icecream(time_of_day: u16) -> Option<u16> {
+ // We use the 24-hour system here, so 10PM is a value of 22 and 12AM is a
+ // value of 0 The Option output should gracefully handle cases where
+ // time_of_day > 23.
+ // TODO: Complete the function body - remember to return an Option!
+ ???
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn check_icecream() {
+ assert_eq!(maybe_icecream(9), Some(5));
+ assert_eq!(maybe_icecream(10), Some(5));
+ assert_eq!(maybe_icecream(23), Some(0));
+ assert_eq!(maybe_icecream(22), Some(0));
+ assert_eq!(maybe_icecream(25), 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/12_options/options2.rs b/exercises/12_options/options2.rs
new file mode 100644
index 0000000..4d998e7
--- /dev/null
+++ b/exercises/12_options/options2.rs
@@ -0,0 +1,42 @@
+// options2.rs
+//
+// Execute `rustlings hint options2` or use the `hint` watch subcommand for a
+// hint.
+
+// I AM NOT DONE
+
+#[cfg(test)]
+mod tests {
+ #[test]
+ fn simple_option() {
+ let target = "rustlings";
+ let optional_target = Some(target);
+
+ // TODO: Make this an if let statement whose value is "Some" type
+ word = optional_target {
+ assert_eq!(word, target);
+ }
+ }
+
+ #[test]
+ fn layered_option() {
+ let range = 10;
+ let mut optional_integers: Vec<Option<i8>> = vec![None];
+
+ for i in 1..(range + 1) {
+ optional_integers.push(Some(i));
+ }
+
+ let mut cursor = range;
+
+ // 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.pop() {
+ assert_eq!(integer, cursor);
+ cursor -= 1;
+ }
+
+ assert_eq!(cursor, 0);
+ }
+}
diff --git a/exercises/12_options/options3.rs b/exercises/12_options/options3.rs
new file mode 100644
index 0000000..23c15ea
--- /dev/null
+++ b/exercises/12_options/options3.rs
@@ -0,0 +1,21 @@
+// 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),
+ _ => panic!("no match!"),
+ }
+ y; // Fix without deleting this line.
+}