You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 12:50:26