无法为具有迭代器<项=....>类型的字段赋值

  • 本文关键字:类型 赋值 字段 迭代器 rust
  • 更新时间 :
  • 英文 :


以下代码:

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();
}
}

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

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}>`

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

谢谢!

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

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

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();
}
}

另一种方法是放弃泛型而使用trait对象:

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());
}
}

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

let mut val = Abc<MyCustomIteratorType<Item=u64>> { my_iter: MyCustomIteratorType::new() };
val.func1();

这里对func1的调用将尝试将MyCustomIteratorType类型的my_iter替换为IntoIter

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

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实现。

相关内容

最新更新