Skip to content

Commit

Permalink
changed the task to make it more appropriate
Browse files Browse the repository at this point in the history
  • Loading branch information
poneciak57 committed Jul 12, 2024
1 parent 938b90e commit 52af067
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 35 deletions.
47 changes: 33 additions & 14 deletions exercises/14_generics/generics3.rs
Original file line number Diff line number Diff line change
@@ -1,14 1,13 @@
// 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::<Vec<String>>()
.join(", ");
format!("[{items_str}]")
// This function should take an array of `Option` elements and returns array of not None elements
// TODO fix this function signature
fn into_dispose_nulls(list: Vec<Option<&str>>) -> Vec<&str> {
list
.into_iter()
.flatten()
.collect()
}

fn main() {
Expand All @@ -21,15 20,35 @@ mod tests {

#[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());
let names_list = vec![Some("maria"), Some("jacob"), None, Some("kacper"), None];
let only_values = into_dispose_nulls(names_list);
assert_eq!(only_values.len(), 3);
}

#[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());
let numbers_list = vec![Some(1), Some(2), None, Some(3)];
let only_values = into_dispose_nulls(numbers_list);
assert_eq!(only_values.len(), 3);
}

#[test]
fn store_custom_type_on_list() {
#[allow(dead_code)]
struct Rectangle {
width: i32,
height: i32
}
impl Rectangle {
fn new(width: i32, height: i32) -> Self {
Self { width, height }
}
}

let custom_list = vec![Some(Rectangle::new(1, 2)), None, None, Some(Rectangle::new(3, 4))];
let only_values = into_dispose_nulls(custom_list);
assert_eq!(only_values.len(), 2);
}


}
5 changes: 1 addition & 4 deletions rustlings-macros/info.toml
Original file line number Diff line number Diff line change
Expand Up @@ -746,13 746,10 @@ 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.
The `into_dispose_nulls` 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
Expand Down
47 changes: 30 additions & 17 deletions solutions/14_generics/generics3.rs
Original file line number Diff line number Diff line change
@@ -1,17 1,13 @@
// 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<T>(list: &[T]) -> 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::<Vec<String>>()
.join(", ");
format!("[{items_str}]")
// Here we added generic type `T` to function signature
// Now this function can be used with vector of any
fn into_dispose_nulls<T>(list: Vec<Option<T>>) -> Vec<T> {
list
.into_iter()
.flatten()
.collect()
}

fn main() {
Expand All @@ -24,15 20,32 @@ mod tests {

#[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());
let names_list = vec![Some("maria"), Some("jacob"), None, Some("kacper"), None];
let only_values = into_dispose_nulls(names_list);
assert_eq!(only_values.len(), 3);
}

#[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());
let numbers_list = vec![Some(1), Some(2), None, Some(3)];
let only_values = into_dispose_nulls(numbers_list);
assert_eq!(only_values.len(), 3);
}

#[test]
fn store_custom_type_on_list() {
struct Rectangle {
width: i32,
height: i32
}
impl Rectangle {
fn new(width: i32, height: i32) -> Self {
Self { width, height }
}
}

let custom_list = vec![Some(Rectangle::new(1, 2)), None, None, Some(Rectangle::new(3, 4))];
let only_values = into_dispose_nulls(custom_list);
assert_eq!(only_values.len(), 2);
}
}

0 comments on commit 52af067

Please sign in to comment.