【发布时间】:2021-06-29 07:37:36
【问题描述】:
在以下示例中,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`
【问题讨论】:
-
仔细阅读错误信息:
O是可迭代的,但&O不是。 -
我认为这是问题所在,但事实并非如此,我将 &V 替换为 &Vec 并且它有效
-
那是因为
&Vec实现了IntoIterator... -
这不仅仅是语法的怪癖:
IntoIterator::into_iter()接受self,即需要消耗它被调用的值。如果您只有一个对象的引用,那么它实现IntoIterator的事实是没有用的,因为您不能使用引用来使用该对象。&Vec提供了IntoIterator的单独实现,它简单地调用self.iter()并返回一个迭代器,该迭代器产生对向量元素的引用。 -
所以我不确定如何解决它,我是否需要为
&OtherTrait实现IntoIterator?