rust - 为什么即使它实现了 IntoIterator,对于泛型类型的引用,我也会收到错误“特征 `Iterator` 未实现”?
问题描述
在以下示例中,MyTrait
extendsIntoIterator
但在循环中使用时编译器无法识别它。
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
implements 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>
.
相关问题
推荐阅读
- firebase - 在 Vue CLI 项目中初始化 Firebase 和 ServiceWorkert 时,移动网页为空白
- ios - Xcode 的助理代码编辑器中是否有“简化”的代码视图?
- r - 如果两个dfs中的两个“age”变量在R中匹配,如何将新列添加到作为变量“hr”的-ln的数据框中?
- wordpress - How to use upgrader_process_complete hook in WordPress to check for spcific plugin update
- google-classroom - 如果我使用与我共享的表单在 Google 课堂上创建作业,谁会看到提交的内容?
- javascript - 从javascript函数spring boot thymeleaf js内部设置模型属性var
- java - asp MVC存储库中的返回类型问题
- perl - IPC::System::Simple capturex 是如何工作的?
- javascript - 如何获取 async / await 函数的结果?
- excel - 根据另一个单元格对一个单元格进行颜色格式化