rust - 为什么我不能将 `&Iterator<Item = &String>` 用作迭代器?

标签 rust

我有以下函数,它应该在给定 Iterator 的情况下查找并返回 String 的最长长度:

fn max_width(strings: &Iterator<Item = &String>) -> usize {
    let mut max_width = 0;
    for string in strings {
        if string.len() > max_width {
            max_width = string.len();
        }
    }
    return max_width;
}

但是,编译器给我以下错误:

error[E0277]: the trait bound `&std::iter::Iterator<Item=&std::string::String>: std::iter::Iterator` is not satisfied
 --> src/main.rs:3:19
  |
3 |     for string in strings {
  |                   ^^^^^^^ `&std::iter::Iterator<Item=&std::string::String>` is not an iterator; maybe try calling `.iter()` or a similar method
  |
  = help: the trait `std::iter::Iterator` is not implemented for `&std::iter::Iterator<Item=&std::string::String>`
  = note: required by `std::iter::IntoIterator::into_iter`

我是 Rust 的新手,对此感到非常困惑,因为我认为我是在显式传递一个迭代器。调用 strings.iter() 告诉我它没有实现,调用 strings.into_iter() 让我掉进了一个可变性的兔子洞,我当然不会想要改变传递的参数。

如何遍历我的字符串?

最佳答案

您的代码失败,因为 Iterator&Iterator 不同。如果您将 Iterator 传递给您的函数,您可以解决此问题,但由于 Iterator 是一个特征,因此无法确定大小(您不知道,什么 Iterator 你正在通过)。解决方案是传递任何实现 Iterator 的东西:

fn max_width<'a>(strings: impl Iterator<Item = &'a String>) -> usize

playground


对于更有经验的 Rust 用户:

最通用的方式大概是这样的:

fn max_width<T: AsRef<str>>(strings: impl IntoIterator<Item = T>) -> usize {
    let mut max_width = 0;
    for string in strings {
        let string = string.as_ref();
        if string.len() > max_width {
            max_width = string.len();
        }
    }
    max_width
}

playground

但是,您也可以使用

fn max_width<T: AsRef<str>>(strings: impl IntoIterator<Item = T>) -> usize {
    strings
        .into_iter()
        .map(|s| s.as_ref().len())
        .max()
        .unwrap_or(0)
}

playground

关于rust - 为什么我不能将 `&Iterator<Item = &String>` 用作迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51758485/

相关文章:

rust - 如何在 Rust 的稳定版本上使用 rocket

Rust 似乎在内存中为 bool 数组分配了与 8 位整数数组相同的空间

rust - 字符串是 Drop 还是 Copy?

generics - Rust:对通用参数的引用不满足特征绑定(bind)

rust - 可变与不可变生命周期

rust - 如何在不借用 Rust 的情况下进行匹配?

rust - 我无法理解 Rust "scope"定义(Rust 编程语言,第二版。Klabnik & Nichols)

rust - 如何将元素插入向量向量中的最后一个向量?

rust - 使用装箱特征对象时,Rust 的生命周期规则是什么?

generics - 无法创建多态类型,因为无法将特征制成对象