rust - 为什么我会收到错误 "the trait ` Iterator` is not implemented"以引用泛型类型,即使它实现了 IntoIterator?

标签 rust traits

在下面的示例中,MyTrait 扩展了 IntoIterator,但编译器在循环中使用时无法识别它。

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`

最佳答案

只有 M工具 IntoIterator ,但您正在尝试迭代 &M ,这不是必须的。

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

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

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

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()转动 Iterator<Item = &i32>Iterator<Item = i32> .

相关问题

关于rust - 为什么我会收到错误 "the trait ` Iterator` is not implemented"以引用泛型类型,即使它实现了 IntoIterator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66919186/

相关文章:

rust - 为什么盒装变量需要显式类型才能传递给函数?

scala - scala 中的特征推断

multidimensional-array - ndarray-尝试将impl AddAssign <ArrayBase>用于ArrayBase会导致编译器错误

rust - 使用类型和引用重载运算符

rust - 为什么不能在结构定义中省略生命周期?

collections - 如何将迭代器推送到现有向量(或任何其他集合)?

postgresql - 如何将 HashMap 作为 JSON 类型插入到 PostgreSQL 中?

groovy - 使用 Groovy 特征编写 Geb 页面

python - PyO3 将 rust 结构转换为 &PyAny

reference - Vec<PathBuf> 到 &[&Path] 没有分配?