gpt4 book ai didi

generics - 从和进入实现

转载 作者:行者123 更新时间:2023-12-01 23:22:40 25 4
gpt4 key购买 nike

我想将“A”的类型转换为“B”,并将“A”的集合转换为“B”的集合(反之亦然)。

我对该机制的工作原理有一些误解。

我假设在基类型上实现 From 会以类似的方式转移到集合,而无需显式实现。

例如:

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=aaffccd542d750a4e7061fc0045b712c

struct A {
text: String
}

struct B {
text: String
}

impl From<A> for B {
fn from(a: A) -> Self {
B { text: a.text }
}
}
fn main() {
let a = A { text: "hello".to_string() };
let b = B::from(a); // works
let a2 = A { text: "hello".to_string() };
let b2 = a.into(); // works
let v1 = vec![A { text: "hello".to_string()}];
let v2 = Vec::<B>::from(v1); // doesn't work
let v2 : Vec<B> = v1.into(); // doesn't work
}

我在转换集合时遇到的错误:

Compiling playground v0.0.1 (/playground)
error[E0277]: the trait bound `Vec<B>: From<Vec<A>>` is not satisfied
--> src/main.rs:20:14
|
20 | let v2 = Vec::<B>::from(v1); // doesn't work
| ^^^^^^^^^^^^^^ the trait `From<Vec<A>>` is not implemented for `Vec<B>`
|
= help: the following implementations were found:
<Vec<T, A> as From<Box<[T], A>>>
<Vec<T> as From<&[T]>>
<Vec<T> as From<&mut [T]>>
<Vec<T> as From<BinaryHeap<T>>>
and 6 others
= note: required by `from`

error[E0277]: the trait bound `Vec<B>: From<Vec<A>>` is not satisfied
--> src/main.rs:21:26
|
21 | let v2 : Vec<B> = v1.into(); // doesn't work
| ^^^^ the trait `From<Vec<A>>` is not implemented for `Vec<B>`
|
= help: the following implementations were found:
<Vec<T, A> as From<Box<[T], A>>>
<Vec<T> as From<&[T]>>
<Vec<T> as From<&mut [T]>>
<Vec<T> as From<BinaryHeap<T>>>
and 6 others
= note: required because of the requirements on the impl of `Into<Vec<B>>` for `Vec<A>`

是否有针对这些嵌套转换的“一揽子”实现?如果不是,实现这种灵 active 的最佳方式是什么?

最佳答案

into_iter 消耗 vec和 map Into::into在将项目收集到新向量之前:

let v2: Vec<B> = v1.into_iter().map(Into::into).collect();

Playground

关于generics - 从和进入实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67786396/

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