Complete options exercises

This commit is contained in:
Suzie Kim 2024-02-01 16:27:28 -05:00
parent ec6bd80f6a
commit 7b3b71242b
No known key found for this signature in database
GPG key ID: 83C4CC3808F9AAE9
3 changed files with 24 additions and 11 deletions

View file

@ -3,7 +3,6 @@
// Execute `rustlings hint options1` or use the `hint` watch subcommand for a // Execute `rustlings hint options1` or use the `hint` watch subcommand for a
// hint. // hint.
// I AM NOT DONE
// This function returns how much icecream there is left in the fridge. // 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 // If it's before 10PM, there's 5 pieces left. At 10PM, someone eats them
@ -13,7 +12,13 @@ fn maybe_icecream(time_of_day: u16) -> Option<u16> {
// value of 0 The Option output should gracefully handle cases where // value of 0 The Option output should gracefully handle cases where
// time_of_day > 23. // time_of_day > 23.
// TODO: Complete the function body - remember to return an Option! // TODO: Complete the function body - remember to return an Option!
??? if time_of_day > 23 {
None
} else if time_of_day >= 22 {
Some(0)
} else {
Some(5)
}
} }
#[cfg(test)] #[cfg(test)]
@ -34,6 +39,10 @@ mod tests {
// TODO: Fix this test. How do you get at the value contained in the // TODO: Fix this test. How do you get at the value contained in the
// Option? // Option?
let icecreams = maybe_icecream(12); let icecreams = maybe_icecream(12);
assert_eq!(icecreams, 5); assert_eq!(icecreams.unwrap(), 5);
} }
} }
// Option has two variants: None and Some
// Some is a tuple struct that wraps a value with type T
// None indicates failure or lack of value

View file

@ -3,8 +3,6 @@
// Execute `rustlings hint options2` or use the `hint` watch subcommand for a // Execute `rustlings hint options2` or use the `hint` watch subcommand for a
// hint. // hint.
// I AM NOT DONE
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
#[test] #[test]
@ -13,16 +11,21 @@ mod tests {
let optional_target = Some(target); let optional_target = Some(target);
// TODO: Make this an if let statement whose value is "Some" type // TODO: Make this an if let statement whose value is "Some" type
word = optional_target { // This block is checking whether or not optional_target is a typen of Some(T)
// Since it is, it's binding the value of Some(target) to word.
// The result is word = Some(Some(target))
if let Some(word) = optional_target {
assert_eq!(word, target); assert_eq!(word, target);
} }
} }
#[test] #[test]
fn layered_option() { fn layered_option() {
let range = 10; let range = 10;
let mut optional_integers: Vec<Option<i8>> = vec![None]; let mut optional_integers: Vec<Option<i8>> = vec![None];
// Range is inclusive of the start and exclusive of the end.
for i in 1..(range + 1) { for i in 1..(range + 1) {
optional_integers.push(Some(i)); optional_integers.push(Some(i));
} }
@ -32,7 +35,8 @@ mod tests {
// TODO: make this a while let statement - remember that vector.pop also // 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 // adds another layer of Option<T>. You can stack `Option<T>`s into
// while let and if let. // while let and if let.
integer = optional_integers.pop() { while let Some(Some(integer)) = optional_integers.pop() {
// Removes the last character for the vector and return it
assert_eq!(integer, cursor); assert_eq!(integer, cursor);
cursor -= 1; cursor -= 1;
} }

View file

@ -3,7 +3,6 @@
// Execute `rustlings hint options3` or use the `hint` watch subcommand for a // Execute `rustlings hint options3` or use the `hint` watch subcommand for a
// hint. // hint.
// I AM NOT DONE
struct Point { struct Point {
x: i32, x: i32,
@ -13,8 +12,9 @@ struct Point {
fn main() { fn main() {
let y: Option<Point> = Some(Point { x: 100, y: 200 }); let y: Option<Point> = Some(Point { x: 100, y: 200 });
match y { match y { // &y can also be used here to borrow instead of moving ownership of y to the match expression
Some(p) => println!("Co-ordinates are {},{} ", p.x, p.y), // ref is used during pattern matching.
Some(ref p) => println!("Co-ordinates are {},{} ", p.x, p.y),
_ => panic!("no match!"), _ => panic!("no match!"),
} }
y; // Fix without deleting this line. y; // Fix without deleting this line.