首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法为具有Iterator<Item=....>类型的字段赋值

无法为具有Iterator<Item=....>类型的字段赋值
EN

Stack Overflow用户
提问于 2021-09-30 06:06:56
回答 2查看 66关注 0票数 1

以下代码:

代码语言:javascript
复制
struct Abc<I>
    where I: Iterator<Item=u64> {

    my_iter: I,
}

impl<I> Abc<I>
    where I: Iterator<Item=u64> {

    fn func1(&mut self) {
        self.my_iter = vec![1,2,3,4,5].into_iter();
    }
}

编译失败,出现以下错误:

代码语言:javascript
复制
error[E0308]: mismatched types
  --> src/abc.rs:16:24
   |
12 | impl<I> Abc<I>
   |      - this type parameter
...
16 |         self.my_iter = vec![1,2,3,4,5].into_iter();
   |                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected type parameter `I`, found struct `std::vec::IntoIter`
   |
   = note: expected type parameter `I`
                      found struct `std::vec::IntoIter<{integer}>`

为什么它不工作,以及如何修复它?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2021-09-30 11:52:53

问题是在Abc<I>中,Abc的用户可以选择任何I,只要它实现了Iterator<Item = u64>。但是Abc::func1()假定有一个非常具体的迭代器。有两种方法可以解决它:

一种是使func1()仅在迭代器类型是它可以使用的类型时才可用:

代码语言:javascript
复制
struct Abc<I> {
    my_iter: I,
}

impl Abc<std::vec::IntoIter<u64>> {
    fn func1(&mut self) {
        self.my_iter = vec![1,2,3,4,5].into_iter();
    }
}

另一种是放弃泛型,转而使用特征对象:

代码语言:javascript
复制
struct Abc {
    my_iter: Box<dyn Iterator<Item = u64>>,
}

impl Abc {
    fn func1(&mut self) {
        self.my_iter = Box::new(vec![1,2,3,4,5].into_iter());
    }
}
票数 1
EN

Stack Overflow用户

发布于 2021-09-30 07:21:29

编译器的消息是正确的,存在类型不匹配。您正在尝试将类型为std::vec::IntoIter<{integer}>的值赋给类型为I的字段。你可以看到为什么这个例子不起作用:

代码语言:javascript
复制
let mut val = Abc<MyCustomIteratorType<Item=u64>> { my_iter: MyCustomIteratorType::new() };
val.func1();

在这里,对func1的调用将尝试将类型为MyCustomIteratorTypemy_iter替换为IntoIter

我不确定你想要达到什么目的,但是解决这个问题的一个选择是:

代码语言:javascript
复制
struct Abc<I>
    where I: Iterator<Item=u64> {

    my_iter: I,
}

impl Abc<std::vec::IntoIter<u64>>
    fn func1(&mut self) {
        self.my_iter = vec![1,2,3,4,5].into_iter();
    }
}

对于不同的迭代器类型,可以有不同的func1实现。

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

https://stackoverflow.com/questions/69386978

复制
相关文章

相似问题

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