当 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));