gpt4 book ai didi

rust - 当 U 的 From 可用时,将 Vec 转换为 Vec

转载 作者:行者123 更新时间:2023-12-05 00:44:37 25 4
gpt4 key购买 nike

我已经实现了From<T> for U ,并期望我可以调用Vec<U>::extendVec<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);

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

let mut v: Vec<U> = /**/;
let other: Vec<T> = /**/;

v.extend(other.into_iter().map(<U as From<T>>::from));

Playground .
或者您可以省略特定的 From实现并让编译器“为你做丑事”,正如评论中提到的@Stargateur:
v.extend(other.into_iter().map(From::from));

关于rust - 当 U 的 From<T> 可用时,将 Vec<T> 转换为 Vec<U>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59978109/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com