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

Rust字符串后缀排序代码报错‘`()` is not an iterator’原因解析

Rust字符串后缀排序代码编译错误解析

你要实现获取字符串s的所有后缀并按字典序排序的功能,但代码编译报错,核心问题及解决方法如下:

原代码

let mut sorted = (0..s.len())
        .map(|i| (i, &s[i..s.len()]))
        .collect::<Vec<(usize, &str)>>()
        .sort_by_key(|k| k.1);
for elem in sorted {
    println!("{} {}", elem.0, elem.1);
}

编译错误

error[E0277]: () is not an iterator
--> src/lt05.rs:7:17
|

for elem in sorted {
^^^^^^ () is not an iterator

= help: the trait Iterator is not implemented for ()
= note: required for () to implement IntoIterator

问题原因

Rust中Vec::sort_by_key是原地排序方法——它直接修改调用它的Vec实例,返回值是单元类型()(空值)。你的代码将collect返回的Vec直接链式调用sort_by_key,导致整个表达式的结果是(),最终sorted的类型变成了()。而for循环需要遍历实现IntoIterator的类型,()不满足这个要求,因此触发编译错误。

修正方案

将collect和sort_by_key拆分为两步:先通过collect生成Vec并赋值给sorted,再调用sorted.sort_by_key完成原地排序:

// 先收集所有后缀到Vec中
let mut sorted = (0..s.len())
    .map(|i| (i, &s[i..])) // 简化&s[i..s.len()]为&s[i..],效果一致
    .collect::<Vec<(usize, &str)>>();
// 对Vec进行原地字典序排序
sorted.sort_by_key(|k| k.1);

完整可运行代码

fn main() {
    let s = "rustlang";
    let mut sorted = (0..s.len())
        .map(|i| (i, &s[i..]))
        .collect::<Vec<(usize, &str)>>();
    sorted.sort_by_key(|k| k.1);
    
    for elem in sorted {
        println!("{} {}", elem.0, elem.1);
    }
}

内容的提问来源于stack exchange,提问作者creaple

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:50:41