I'm working on the rustlings iterators2.rs
exercise. Just for completeness, I will put my full working solution at the end, but my question focuses on just a couple lines.
I have the below which works
words.iter().map(|word| capitalize_first(word)).collect()
But since the closure is just forwarding a single parameter to the function, I want to understand why this is not equivalent to
words.iter().map(capitalize_first).collect()
which fails to compile.
My full Solution
pub fn capitalize_first(input: &str) -> String { let mut c = input.chars(); match c.next() { None => String::new(), Some(first) => first.to_uppercase().to_string() + c.as_str() } }
// Step 2.
// Apply thecapitalize_first
function to a slice of string slices.
// Return a vector of strings.
// ["hello", "world"] -> ["Hello", "World"]
pub fn capitalize_words_vector(words: &[&str]) -> Vec {
words.iter().map(|word| capitalize_first(word)).collect()
}// Step 3.
// Apply thecapitalize_first
function again to a slice of string slices.
// Return a single string.
// ["hello", " ", "world"] -> "Hello World"
pub fn capitalize_words_string(words: &[&str]) -> String {
words.iter().map(|word| capitalize_first(word)).collect()
}#[cfg(test)]
mod tests {
use super::*;#[test] fn test_success() { assert_eq!(capitalize_first("hello"), "Hello"); } #[test] fn test_empty() { assert_eq!(capitalize_first(""), ""); } #[test] fn test_iterate_string_vec() { let words = vec!["hello", "world"]; assert_eq!(capitalize_words_vector(&words), ["Hello", "World"]); } #[test] fn test_iterate_into_string() { let words = vec!["hello", " ", "world"]; assert_eq!(capitalize_words_string(&words), "Hello World"); }
}