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
Iteratoris not implemented for()
= note: required for()to implementIntoIterator
问题原因
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
相关产品推荐
相关产品推荐

