我已经实现了From<T> for U
,希望我可以打Vec<U>::extend
一个电话Vec<T>
。相反,我得到了expected T, got U
。解决此问题的最惯用的方法是什么?
struct U;
struct T;
impl From<T> for U {
fn from(_other: T) -> Self {
U
}
}
fn main() {
let mut v: Vec<U> = Vec::new();
let other: Vec<T> = Vec::new();
v.extend(other.into_iter());
}
error[E0271]: type mismatch resolving `<std::vec::IntoIter<T> as std::iter::IntoIterator>::Item == U`
--> src/main.rs:14:7
|
14 | v.extend(other.into_iter());
| ^^^^^^ expected struct `T`, found struct `U`
|
= note: expected type `T`
found type `U`
因为Extend::extend
需要一个迭代器:
fn extend<T: IntoIterator<Item = A>>(&mut self, iter: T);
您实际上可以使用地图适配器:
let mut v: Vec<U> = /**/;
let other: Vec<T> = /**/;
v.extend(other.into_iter().map(<U as From<T>>::from));
操场。或者,您可以取消特定的From
实现,并让编译器像注释中提到的@Stargateur那样“为您做丑事”:
v.extend(other.into_iter().map(From::from));
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句