如果元素可以转换,为什么不能使用 .into() 转换容器?
Why can't you convert containers using .into() if the elements can be converted?
如果我有一个 Vec<T>
我不能直接使用 .into()
将它转换成 Vec<U>
即使我可以使用 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
。
为了能够解决这个问题,简而言之需要 specialization (Issue #31844)。
// 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论坛上讨论过:
如果我有一个 Vec<T>
我不能直接使用 .into()
将它转换成 Vec<U>
即使我可以使用 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
。
为了能够解决这个问题,简而言之需要 specialization (Issue #31844)。
// 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论坛上讨论过: