From 55cc8584bdec5023637e2f6985e4df129401ea8b Mon Sep 17 00:00:00 2001 From: Kacper Poneta Date: Thu, 11 Jul 2024 22:53:38 +0200 Subject: [PATCH] added exercise --- exercises/14_generics/generics3.rs | 35 +++++++++++++++++++++++++++ rustlings-macros/info.toml | 14 +++++++++++ solutions/14_generics/generics3.rs | 38 ++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 exercises/14_generics/generics3.rs create mode 100644 solutions/14_generics/generics3.rs diff --git a/exercises/14_generics/generics3.rs b/exercises/14_generics/generics3.rs new file mode 100644 index 00000000..e90b3250 --- /dev/null +++ b/exercises/14_generics/generics3.rs @@ -0,0 +1,35 @@ +// generics3.rs +// Execute `rustlings hint generics3` or use the `hint` watch subcommand for a hint. + +// TODO Use your knowledge of generics to enchance the `stringify` function by only changing the signature. +fn stringify(list: &[&str]) -> String { + let items_str = list + .iter() + .map(|e| e.to_string()) + .collect::>() + .join(", "); + format!("[{items_str}]") +} + +fn main() { + // You can optionally experiment here. +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn store_str_on_list() { + let names_list = vec!["maria", "jacob", "kacper"]; + let stringified = stringify(&names_list); + assert_eq!(stringified, "[maria, jacob, kacper]".to_string()); + } + + #[test] + fn store_numbers_on_list() { + let numbers_list = vec![1, 2, 3]; + let stringified = stringify(&numbers_list); + assert_eq!(stringified, "[1, 2, 3]".to_string()); + } +} \ No newline at end of file diff --git a/rustlings-macros/info.toml b/rustlings-macros/info.toml index e69834ac..feced7c8 100644 --- a/rustlings-macros/info.toml +++ b/rustlings-macros/info.toml @@ -741,6 +741,20 @@ hint = """ Related section in The Book: https://doc.rust-lang.org/book/ch10-01-syntax.html#in-method-definitions""" +[[exercises]] +name = "generics3" +dir = "14_generics" +hint = """ +Vectors in Rust use generics to create dynamically-sized arrays of any type. +The stringify function takes a vector as an argument, but only accepts vectors that store the &str type. +To allow the function to accept vectors that store any type, you can leverage your knowledge about generics. +If you're unsure how to proceed, please refer to the Rust Book at: +https://doc.rust-lang.org/book/ch10-01-syntax.html#in-function-definitions. + +*Please note that in `stringify` we want to use `.to_string()` on vector elements +Refer to this: https://doc.rust-lang.org/book/ch10-02-traits.html +""" + # TRAITS [[exercises]] diff --git a/solutions/14_generics/generics3.rs b/solutions/14_generics/generics3.rs new file mode 100644 index 00000000..165fb6ad --- /dev/null +++ b/solutions/14_generics/generics3.rs @@ -0,0 +1,38 @@ +// generics3.rs +// Execute `rustlings hint generics3` or use the `hint` watch subcommand for a hint. + +// Here we add generic in function declaration so function can work with different types +fn stringify(list: &Vec) -> String +where + T: ToString // here we also specify that T needs to implement ToString trait so we can use .to_string() on the vetor elements +{ + let items_str = list + .iter() + .map(|e| e.to_string()) + .collect::>() + .join(", "); + format!("[{items_str}]") +} + +fn main() { + // You can optionally experiment here. +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn store_str_on_list() { + let names_list = vec!["maria", "jacob", "kacper"]; + let stringified = stringify(&names_list); + assert_eq!(stringified, "[maria, jacob, kacper]".to_string()); + } + + #[test] + fn store_numbers_on_list() { + let numbers_list = vec![1, 2, 3]; + let stringified = stringify(&numbers_list); + assert_eq!(stringified, "[1, 2, 3]".to_string()); + } +} \ No newline at end of file