以下代码:
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}>`为什么它不工作,以及如何修复它?
谢谢!
发布于 2021-09-30 11:52:53
问题是在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();
}
}另一种是放弃泛型,转而使用特征对象:
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());
}
}发布于 2021-09-30 07:21:29
编译器的消息是正确的,存在类型不匹配。您正在尝试将类型为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实现。
https://stackoverflow.com/questions/69386978
复制相似问题