当 From<T> for U 可用时,将 Vec<T> 转换为 Vec<U>

Mat*_*ner 4 type-conversion traits rust

我已经实施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());
}
Run Code Online (Sandbox Code Playgroud)
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`
Run Code Online (Sandbox Code Playgroud)

Opt*_*ach 5

因为Extend::extend需要一个迭代器:

fn extend<T: IntoIterator<Item = A>>(&mut self, iter: T);
Run Code Online (Sandbox Code Playgroud)

您实际上可以使用地图适配器:

fn extend<T: IntoIterator<Item = A>>(&mut self, iter: T);
Run Code Online (Sandbox Code Playgroud)

游乐场。或者你可以省略特定的From实现,让编译器“为你做丑陋的事情”,正如评论中提到的@Stargateur:

v.extend(other.into_iter().map(From::from));
Run Code Online (Sandbox Code Playgroud)