首页 > 解决方案 > 为什么即使它实现了 IntoIterator,对于泛型类型的引用,我也会收到错误“特征 `Iterator` 未实现”?

问题描述

在以下示例中,MyTraitextendsIntoIterator但在循环中使用时编译器无法识别它。

pub trait MyTrait: IntoIterator<Item = i32> {
    fn foo(&self);
}

pub fn run<M: MyTrait>(my: &M) {
    for a in my {
        println!("{}", a);
    }
}

我得到错误:

error[E0277]: `&M` is not an iterator
 --> src/lib.rs:6:14
  |
6 |     for a in my {
  |              ^^ `&M` is not an iterator
  |
  = help: the trait `Iterator` is not implemented for `&M`
  = note: required because of the requirements on the impl of `IntoIterator` for `&M`
  = note: required by `into_iter`

标签: rusttraits

解决方案


Mimplements IntoIterator,但您试图迭代 a &M,而不必这样做。

目前尚不清楚您希望通过 实现什么run,但删除引用可能是一个开始:

pub fn run<M: MyTrait>(my: M) {
    for a in my {
        println!("{}", a);
    }
}

请注意,M 它本身可能是(或包含)引用,因此以这种方式编写它并不意味着您不能将它与借用的数据一起使用。这是run用于迭代&Vec游乐场)的一种方法:

impl<I> MyTrait for I
where
    I: IntoIterator<Item = i32>,
{
    fn foo(&self) {}
}

fn main() {
    let v = vec![10, 12, 20];
    run(v.iter().copied());
}

这用于.copied()将 anIterator<Item = &i32>转换为Iterator<Item = i32>.

相关问题


推荐阅读