summaryrefslogtreecommitdiff
path: root/exercises/options
diff options
context:
space:
mode:
Diffstat (limited to 'exercises/options')
-rw-r--r--exercises/options/README.md20
-rw-r--r--exercises/options/options1.rs37
-rw-r--r--exercises/options/options2.rs25
-rw-r--r--exercises/options/options3.rs19
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.
+}