From 1767f47bc69cc5752c58567a004b87d4f8199e52 Mon Sep 17 00:00:00 2001 From: breayhing <1519981563@qq.com> Date: Thu, 11 Jul 2024 21:51:49 +0800 Subject: [PATCH] :sparkles:add new exercise --- dev/Cargo.toml | 2 ++ exercises/12_options/options4.rs | 46 ++++++++++++++++++++++++++++++++ rustlings-macros/info.toml | 19 +++++++++++++ solutions/12_options/options4.rs | 40 +++++++++++++++++++++++++++ 4 files changed, 107 insertions(+) create mode 100644 exercises/12_options/options4.rs create mode 100644 solutions/12_options/options4.rs diff --git a/dev/Cargo.toml b/dev/Cargo.toml index 7f3acb51..1ef6b798 100644 --- a/dev/Cargo.toml +++ b/dev/Cargo.toml @@ -100,6 +100,8 @@ bin = [ { name = "options2_sol", path = "../solutions/12_options/options2.rs" }, { name = "options3", path = "../exercises/12_options/options3.rs" }, { name = "options3_sol", path = "../solutions/12_options/options3.rs" }, + { name = "options4", path = "../exercises/12_options/options4.rs" }, + { name = "options4_sol", path = "../solutions/12_options/options4.rs" }, { name = "errors1", path = "../exercises/13_error_handling/errors1.rs" }, { name = "errors1_sol", path = "../solutions/13_error_handling/errors1.rs" }, { name = "errors2", path = "../exercises/13_error_handling/errors2.rs" }, diff --git a/exercises/12_options/options4.rs b/exercises/12_options/options4.rs new file mode 100644 index 00000000..b70f07cd --- /dev/null +++ b/exercises/12_options/options4.rs @@ -0,0 +1,46 @@ +#[derive(Debug)] +struct Point { + x: i32, + y: i32, +} + +fn main() { + let optional_point = Some(Point { x: 100, y: 200 }); + + // Exercise 1: Use ok_or to convert optional_point to a Result. + // If the point exists, print its coordinates. + // If it doesn't, print the error message "Point does not exist". + // TODO: Fix the match statement to handle Result properly. + + let result_point = optional_point.ok_or(???); + match result_point { + Ok(p) => println!("Co-ordinates are {},{}", p.x, p.y), + Err(e) => println!("{}", e), + } + + // Exercise 2: Use ok_or_else to achieve the same functionality as above, + // but with a closure to generate the error message. + // TODO: Fix the match statement to handle Result properly. + let result_point_else = optional_point.ok_or_else(???); + match result_point_else { + Ok(p) => println!("Co-ordinates are {},{}", p.x, p.y), + Err(e) => println!("{}", e), + } + + // Exercise 3: Use and_then to chain operations on optional_point. + // If the point exists, compute the distance from the origin and return it as an Option. + // If it doesn't, return None. + let distance_from_origin = optional_point.and_then( + ???{ + let distance = ((p.x.pow(2) + p.y.pow(2)) as f64).sqrt(); + Some(distance) + } + ); + // TODO: Fix the match statement to handle Option properly. + match distance_from_origin { + Some(distance) => println!("Distance from origin is {:.2}", distance), + None => println!("No point to calculate distance"), + } + + println!("{optional_point:?}"); // Don't change this line. +} diff --git a/rustlings-macros/info.toml b/rustlings-macros/info.toml index e69834ac..6a1ffbdc 100644 --- a/rustlings-macros/info.toml +++ b/rustlings-macros/info.toml @@ -627,6 +627,25 @@ After making the correction as suggested by the compiler, read the related docs page: https://doc.rust-lang.org/std/keyword.ref.html""" +[[exercises]] +name = "options4" +dir = "12_options" +test = false +hint = """ +Exercise 1: + +Hint: Use the ok_or method to convert the Option to a Result. Handle the Ok case to print the coordinates and the Err case to print the error message. +Example: optional_point.ok_or("Point does not exist") +Exercise 2: + +Hint: Use the ok_or_else method to convert the Option to a Result, similar to ok_or but using a closure to generate the error message. +Example: optional_point.ok_or_else(|| "Point does not exist") +Exercise 3: + +Hint: Use the and_then method to chain the operation of calculating the distance from the origin. This method should only execute if optional_point is Some. +Example: optional_point.and_then(|p| { let distance = ((p.x.pow(2) + p.y.pow(2)) as f64).sqrt(); Some(distance) }) +""" + # ERROR HANDLING [[exercises]] diff --git a/solutions/12_options/options4.rs b/solutions/12_options/options4.rs new file mode 100644 index 00000000..da8315aa --- /dev/null +++ b/solutions/12_options/options4.rs @@ -0,0 +1,40 @@ +#[derive(Debug)] +struct Point { + x: i32, + y: i32, +} + +fn main() { + let optional_point = Some(Point { x: 100, y: 200 }); + + // Exercise 1: Use ok_or to convert optional_point to a Result. + // If the point exists, print its coordinates. + // If it doesn't, print the error message "Point does not exist". + let result_point = optional_point.ok_or("Point does not exist"); + match result_point { + Ok(p) => println!("Co-ordinates are {},{}", p.x, p.y), + Err(e) => println!("{}", e), + } + + // Exercise 2: Use ok_or_else to achieve the same functionality as above, + // but with a closure to generate the error message. + let result_point_else = optional_point.ok_or_else(|| "Point does not exist"); + match result_point_else { + Ok(p) => println!("Co-ordinates are {},{}", p.x, p.y), + Err(e) => println!("{}", e), + } + + // Exercise 3: Use and_then to chain operations on optional_point. + // If the point exists, compute the distance from the origin and return it as an Option. + // If it doesn't, return None. + let distance_from_origin = optional_point.and_then(|p| { + let distance = ((p.x.pow(2) + p.y.pow(2)) as f64).sqrt(); + Some(distance) + }); + match distance_from_origin { + Some(distance) => println!("Distance from origin is {:.2}", distance), + None => println!("No point to calculate distance"), + } + + println!("{optional_point:?}"); // Don't change this line. +}