当 U 的 From<T> 可用时,将 Vec<T> 转换为 Vec<U>
Convert Vec<T> to Vec<U> when From<T> for U is available
我已经实现了 From<T> for U
,并希望我可以用 Vec<T>
调用 Vec<U>::extend
。相反,我得到 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));
Playground。
或者您可以省略特定的 From
实现并让编译器 "do the ugly thing for you" 正如@Stargateur 在评论中提到的那样:
v.extend(other.into_iter().map(From::from));
我已经实现了 From<T> for U
,并希望我可以用 Vec<T>
调用 Vec<U>::extend
。相反,我得到 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));
Playground。
或者您可以省略特定的 From
实现并让编译器 "do the ugly thing for you" 正如@Stargateur 在评论中提到的那样:
v.extend(other.into_iter().map(From::from));