如果我有一个
Vec<T>
,即使我可以使用Vec<U>
将.into()
转换为T
,我也无法直接使用U
将其转换为.into()
。例如,此代码无法编译:
use std::convert::From;
struct A {
x: i32,
}
struct B {
y: u64,
}
impl From<A> for B {
fn from(a: A) -> Self {
Self {
y: a.x as u64,
}
}
}
fn main() {
let avec: Vec<A> = vec![A{x: 1}, A{x: 2}];
let bvec: Vec<B> = avec.into(); // Error!
}
我觉得应该可以有一个毯子暗示这样的事情:
impl<T, U> From<Vec<T>> for Vec<U> where T: From<U> {
fn from(t: Vec<T>) -> Self {
t.into_iter().map(Into::into).collect()
}
}
其他集合也类似。没有这样做有什么原因吗?当您想要转换时,例如将
HashMap<String, Vec<Vec<u32>>>
转换为 HashMap<String, Vec<Vec<u64>>>
。,它会节省大量繁琐的代码。
(当前)用于转换容器的一揽子实施的问题是,它与现有的一揽子实施相冲突
impl From<T> for T
。
// This:
impl<T, U> From<Vec<T>> for Vec<U> where T: From<U>
// Would conflicts with this:
impl<T> From<T> for T
不久前Rust论坛上也讨论过同样的问题: