3

如果我有 aVec<T>我不能将它Vec<U>直接转换成 using.into()即使我可以转换TUusing .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 是这样的:

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()
    }
}

对于其他系列也是如此。没有这样做是有原因的吗?当你想转换时,它会节省很多繁琐的代码,比如 aHashMap<String, Vec<Vec<u32>>>到 a HashMap<String, Vec<Vec<u64>>>

4

1 回答 1

6

具有用于转换容器的一揽子实施的问题(当前)是它与现有的一揽子实施冲突impl From<T> for T

为了能够解决这个问题,简而言之,它需要专业化问题#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 论坛上讨论了同样的问题:

于 2021-02-24T12:17:16.890 回答