Rust迭代器练习:如何链式调用map与flat_map转换字符串并合并
Rustlings迭代器章节练习问题解决
场景与初始可行代码
正在完成rustlings迭代器章节第二关的第三步练习,需求是对字符串切片的切片应用capitalize_first函数,最终返回单个字符串(例如["hello", " ", "world"]转换为"Hello World")。已写出可行代码:
// 第三步。 // 再次对字符串切片的切片应用`capitalize_first`函数。 // 返回单个字符串。 // ["hello", " ", "world"] -> "Hello World" pub fn capitalize_words_string(words: &[&str]) -> String { let capitalized: Vec<String> = words.iter().map(|word| capitalize_first(&word)).collect(); capitalized.iter().flat_map(|s| s.chars()).collect() }
尝试的链式写法与编译错误
希望将map与flat_map链式调用合并为一行,尝试了如下写法:
words.iter().map(|w| capitalize_first(w)).flat_map(|s| s.char_indices()).collect()
但出现编译错误:
36 | words.iter().map(|w| capitalize_first(w)).flat_map(|s| s.char_indices()).collect() | ^^^^^^^ 无法从`std::iter::Iterator<Item=(usize, char)>`构建类型`String`的值
36 | words.iter().map(|w| capitalize_first(w)).flat_map(|s| s.char_indices()).collect() | ----- ------ ---------------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 此处`Iterator::Item`变为`(usize, char)` | | | | | | | 此处`Iterator::Item`变为`String` | | 此处`Iterator::Item`为`&&str` | 该表达式的类型为`&[&str]`
错误原因与修复方案
错误原因
char_indices()方法返回的迭代器元素类型是(usize, char)(字符索引与字符的元组),而String::collect()要求迭代器元素为char类型,类型不匹配导致编译失败。
修复后的链式写法
将flat_map中的s.char_indices()替换为s.chars()即可,chars()返回仅包含字符的迭代器,符合String构建的要求:
pub fn capitalize_words_string(words: &[&str]) -> String { words.iter().map(|w| capitalize_first(w)).flat_map(|s| s.chars()).collect() }
内容的提问来源于stack exchange,提问作者Philipp A.
相关产品推荐
相关产品推荐

