【问题标题】:Why is rust raising error '`()` is not an iterator'?为什么 Rust 引发错误 \'`()` is not an iterator\'?
【发布时间】:2023-02-01 00:09:35
【问题描述】:

我试图编写一个程序来执行以下操作:获取给定字符串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`

谁能解释一下这段代码有什么问题?

【问题讨论】:

  • 因为sort_by_key是就地操作
  • @AbdulNiyasPM 但我应该如何修复错误?
  • 这回答了你的问题了吗? How do I sort an array?

标签: rust


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 2022-11-24
    相关资源
    最近更新 更多