为什么rust引发错误''()'不是迭代器'?

46scxncf  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(155)

我试着写一个程序来做以下事情:获取给定字符串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);
}

并且rust编译器给出一个错误:

error[E0277]: `()` is not an iterator
 --> src/lt05.rs:7:17
  |
7 |     for elem in sorted {
  |                 ^^^^^^ `()` is not an iterator
  |
  = help: the trait `Iterator` is not implemented for `()`
  = note: required for `()` to implement `IntoIterator`

有人能解释一下这段代码中的错误吗?

nwwlzxa7

nwwlzxa71#

Vec::sort_by_key对一个向量进行排序并返回(),所以在你的代码中sorted最终被赋值为(),这个unit type是你不能迭代的。
要解决这个问题,你可以在构造完向量后,将对sort_by_key的调用移到一个单独的语句中,然后对排序后的向量进行迭代。见下面的例子。这里是一个Rust Playground

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

产出

6 atest
8 est
1 hisisatest
4 isatest
2 isisatest
5 satest
3 sisatest
9 st
10 t
7 test
0 thisisatest

相关问题