以下代码:
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
实现。