首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在泛型类型的引用中,我得到了错误“特性‘`Iterator`’未实现”,即使它实现了IntoIterator?

为什么在泛型类型的引用中,我得到了错误“特性‘`Iterator`’未实现”,即使它实现了IntoIterator?
EN

Stack Overflow用户
提问于 2021-04-02 12:15:02
回答 1查看 3.1K关注 0票数 3

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

代码语言:javascript
复制
pub trait MyTrait: IntoIterator<Item = i32> {
    fn foo(&self);
}

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

我知道错误:

代码语言:javascript
复制
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`
EN

回答 1

Stack Overflow用户

发布于 2021-04-02 14:32:50

只有M实现了IntoIterator,但是您正在尝试在&M上迭代,而这并不是必须的。

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

代码语言:javascript
复制
pub fn run<M: MyTrait>(my: M) {
    for a in my {
        println!("{}", a);
    }
}

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

代码语言:javascript
复制
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>

相关问题

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66919186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档