From 038b56dc102e16409823f29e483b165cd1c43178 Mon Sep 17 00:00:00 2001 From: Hunter Kvalevog Date: Sat, 19 Sep 2026 17:59:40 -0500 Subject: rustlings: complete 09 --- rustlings/.rustlings-state.txt | 8 +++-- rustlings/exercises/09_strings/strings1.rs | 3 +- rustlings/exercises/09_strings/strings2.rs | 3 +- rustlings/exercises/09_strings/strings3.rs | 6 ++-- rustlings/exercises/09_strings/strings4.rs | 20 ++++++------ rustlings/solutions/09_strings/strings1.rs | 9 ++++-- rustlings/solutions/09_strings/strings2.rs | 15 +++++++-- rustlings/solutions/09_strings/strings3.rs | 49 ++++++++++++++++++++++++++++-- rustlings/solutions/09_strings/strings4.rs | 38 +++++++++++++++++++++-- 9 files changed, 124 insertions(+), 27 deletions(-) diff --git a/rustlings/.rustlings-state.txt b/rustlings/.rustlings-state.txt index 4103aed..9dec928 100644 --- a/rustlings/.rustlings-state.txt +++ b/rustlings/.rustlings-state.txt @@ -1,6 +1,6 @@ DON'T EDIT THIS FILE! -strings1 +modules1 intro1 intro2 @@ -37,4 +37,8 @@ structs2 structs3 enums1 enums2 -enums3 \ No newline at end of file +enums3 +strings1 +strings2 +strings3 +strings4 \ No newline at end of file diff --git a/rustlings/exercises/09_strings/strings1.rs b/rustlings/exercises/09_strings/strings1.rs index 6abdbb4..482e5de 100644 --- a/rustlings/exercises/09_strings/strings1.rs +++ b/rustlings/exercises/09_strings/strings1.rs @@ -1,6 +1,5 @@ -// TODO: Fix the compiler error without changing the function signature. fn current_favorite_color() -> String { - "blue" + String::from("blue") } fn main() { diff --git a/rustlings/exercises/09_strings/strings2.rs b/rustlings/exercises/09_strings/strings2.rs index 93d9cb6..b03094f 100644 --- a/rustlings/exercises/09_strings/strings2.rs +++ b/rustlings/exercises/09_strings/strings2.rs @@ -1,4 +1,3 @@ -// TODO: Fix the compiler error in the `main` function without changing this function. fn is_a_color_word(attempt: &str) -> bool { attempt == "green" || attempt == "blue" || attempt == "red" } @@ -6,7 +5,7 @@ fn is_a_color_word(attempt: &str) -> bool { fn main() { let word = String::from("green"); // Don't change this line. - if is_a_color_word(word) { + if is_a_color_word(&word) { println!("That is a color word I know!"); } else { println!("That is not a color word I know."); diff --git a/rustlings/exercises/09_strings/strings3.rs b/rustlings/exercises/09_strings/strings3.rs index f5e45b0..3543ad5 100644 --- a/rustlings/exercises/09_strings/strings3.rs +++ b/rustlings/exercises/09_strings/strings3.rs @@ -1,13 +1,13 @@ fn trim_me(input: &str) -> &str { - // TODO: Remove whitespace from both ends of a string. + input.trim() } fn compose_me(input: &str) -> String { - // TODO: Add " world!" to the string! There are multiple ways to do this. + String::from(input) + " world!" } fn replace_me(input: &str) -> String { - // TODO: Replace "cars" in the string with "balloons". + String::from(input).replace("cars", "balloons") } fn main() { diff --git a/rustlings/exercises/09_strings/strings4.rs b/rustlings/exercises/09_strings/strings4.rs index 4730726..3f7c5e7 100644 --- a/rustlings/exercises/09_strings/strings4.rs +++ b/rustlings/exercises/09_strings/strings4.rs @@ -13,25 +13,25 @@ fn string(arg: String) { // Your task is to replace `placeholder(…)` with either `string_slice(…)` // or `string(…)` depending on what you think each value is. fn main() { - placeholder("blue"); + string_slice("blue"); - placeholder("red".to_string()); + string("red".to_string()); - placeholder(String::from("hi")); + string(String::from("hi")); - placeholder("rust is fun!".to_owned()); + string("rust is fun!".to_owned()); - placeholder("nice weather".into()); + string("nice weather".into()); - placeholder(format!("Interpolation {}", "Station")); + string(format!("Interpolation {}", "Station")); // WARNING: This is byte indexing, not character indexing. // Character indexing can be done using `s.chars().nth(INDEX)`. - placeholder(&String::from("abc")[0..1]); + string_slice(&String::from("abc")[0..1]); - placeholder(" hello there ".trim()); + string_slice(" hello there ".trim()); - placeholder("Happy Monday!".replace("Mon", "Tues")); + string("Happy Monday!".replace("Mon", "Tues")); - placeholder("mY sHiFt KeY iS sTiCkY".to_lowercase()); + string("mY sHiFt KeY iS sTiCkY".to_lowercase()); } diff --git a/rustlings/solutions/09_strings/strings1.rs b/rustlings/solutions/09_strings/strings1.rs index dcf2377..f7ba811 100644 --- a/rustlings/solutions/09_strings/strings1.rs +++ b/rustlings/solutions/09_strings/strings1.rs @@ -1,4 +1,9 @@ +fn current_favorite_color() -> String { + // Equivalent to `String::from("blue")` + "blue".to_string() +} + fn main() { - // DON'T EDIT THIS SOLUTION FILE! - // It will be automatically filled after you finish the exercise. + let answer = current_favorite_color(); + println!("My current favorite color is {answer}"); } diff --git a/rustlings/solutions/09_strings/strings2.rs b/rustlings/solutions/09_strings/strings2.rs index dcf2377..7de311f 100644 --- a/rustlings/solutions/09_strings/strings2.rs +++ b/rustlings/solutions/09_strings/strings2.rs @@ -1,4 +1,15 @@ +fn is_a_color_word(attempt: &str) -> bool { + attempt == "green" || attempt == "blue" || attempt == "red" +} + fn main() { - // DON'T EDIT THIS SOLUTION FILE! - // It will be automatically filled after you finish the exercise. + let word = String::from("green"); + + if is_a_color_word(&word) { + // ^ added to have `&String` which is automatically + // coerced to `&str` by the compiler. + println!("That is a color word I know!"); + } else { + println!("That is not a color word I know."); + } } diff --git a/rustlings/solutions/09_strings/strings3.rs b/rustlings/solutions/09_strings/strings3.rs index dcf2377..ee6b56a 100644 --- a/rustlings/solutions/09_strings/strings3.rs +++ b/rustlings/solutions/09_strings/strings3.rs @@ -1,4 +1,49 @@ +fn trim_me(input: &str) -> &str { + input.trim() +} + +fn compose_me(input: &str) -> String { + // The macro `format!` has the same syntax as `println!`, but it returns a + // string instead of printing it to the terminal. + // Equivalent to `input.to_string() + " world!"` + format!("{input} world!") +} + +fn replace_me(input: &str) -> String { + input.replace("cars", "balloons") +} + fn main() { - // DON'T EDIT THIS SOLUTION FILE! - // It will be automatically filled after you finish the exercise. + // You can optionally experiment here. +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn trim_a_string() { + assert_eq!(trim_me("Hello! "), "Hello!"); + assert_eq!(trim_me(" What's up!"), "What's up!"); + assert_eq!(trim_me(" Hola! "), "Hola!"); + assert_eq!(trim_me("Hi!"), "Hi!"); + } + + #[test] + fn compose_a_string() { + assert_eq!(compose_me("Hello"), "Hello world!"); + assert_eq!(compose_me("Goodbye"), "Goodbye world!"); + } + + #[test] + fn replace_a_string() { + assert_eq!( + replace_me("I think cars are cool"), + "I think balloons are cool", + ); + assert_eq!( + replace_me("I love to look at cars"), + "I love to look at balloons", + ); + } } diff --git a/rustlings/solutions/09_strings/strings4.rs b/rustlings/solutions/09_strings/strings4.rs index dcf2377..3c69b97 100644 --- a/rustlings/solutions/09_strings/strings4.rs +++ b/rustlings/solutions/09_strings/strings4.rs @@ -1,4 +1,38 @@ +fn string_slice(arg: &str) { + println!("{arg}"); +} + +fn string(arg: String) { + println!("{arg}"); +} + fn main() { - // DON'T EDIT THIS SOLUTION FILE! - // It will be automatically filled after you finish the exercise. + string_slice("blue"); + + string("red".to_string()); + + string(String::from("hi")); + + string("rust is fun!".to_owned()); + + // Here, both answers work. + // `.into()` converts a type into an expected type. + // If it is called where `String` is expected, it will convert `&str` to `String`. + string("nice weather".into()); + // But if it is called where `&str` is expected, then `&str` is kept `&str` since no conversion is needed. + // If you remove the `#[allow(…)]` line, then Clippy will tell you to remove `.into()` below since it is a useless conversion. + #[allow(clippy::useless_conversion)] + string_slice("nice weather".into()); + + string(format!("Interpolation {}", "Station")); + + // WARNING: This is byte indexing, not character indexing. + // Character indexing can be done using `s.chars().nth(INDEX)`. + string_slice(&String::from("abc")[0..1]); + + string_slice(" hello there ".trim()); + + string("Happy Monday!".replace("Mon", "Tues")); + + string("mY sHiFt KeY iS sTiCkY".to_lowercase()); } -- cgit v1.2.3