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

马特·乔纳

我已经实现了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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不复制向量的情况下将Vec <T>转换为Vec <U>?

如何将Vec <&mut T>转换为Vec <&T>?

如何将Vec <Rgb <u8 >>转换为Vec <u8>

将Vec <u64>转换为Vec <(&str,u64)>以获得tui :: BarChart数据

将Vec <u32>转换为Vec <u8>并以最小的开销

将Vec <Vec <u8 >>转换为&[&[u8]]

将 Vec<u32> 转换为 Vec<u64>(或 Vec<std::os::raw::c_ulong>)

对于所有类型“ T”,“ U”,如果将“ T”强制转换为“ U”,那么将“&T”强制转换为“&U”是否成立?

如何将 Vec<T> 转换为 HashMap<T,T>?

使用flat_map将Vec <u8>转换为Vec <char>

将&[T]类型的输入向量转换为Vec <T>

将u8数组的引用转换为<Vec <u8 >>

如何将Expression <Action <T,object >>转换为Expression <Action <T,U >>?

是否有将Vec <T>转换为数组的好方法?

实现Stream <T>,可以将其转换为Stream <U>,其中U是T的基数

如何在Windows上将OsStr转换为&[u8] / Vec <u8>?

如何将IoSliceMut数组转换为Vec <u8>?

如何将 Vec<u8> 转换为 bson::document::Document?

在 Rust 中,如何定義將 Vec<T> 轉換為 Vec<U> 的通用函數

是否可以创建可用作T [A,B]的泛型T [A <:C [U],B <:C [U],U]?

将Expression <Func <T,U >>转换为Expression <Func <object,object >>

如何使用Rust和Web-sys将Clamped <Vec <u8 >>转换为Clamped <&mut [u8]>?

参数类型与将匿名表达式<Func <T,U >>转换为非匿名表达式<Func <T,U >>不匹配

有没有一种方法可以将“ Vec <Vec <T >>”转换为“ Vec <T>”,将所有的“ Vec <T>”组合成一个“ Vec <T>”?

尝试将std :: vector <std :: pair <T,U >>强制转换为其左值引用时,出现VS编译器警告C4239

如何将Vec <T>转换为C友好的* mut T?

我可以从&[u32]中滤除特定数字并将其转换为Vec <u32>吗?

转换列表<T>地图<T,U>使用Java 8

Same <T,U>为什么不包含Same <U,T>?