如果元素可以转换,为什么不能使用 .into() 转换容器?

问题描述

如果我有 Vec<T>,即使我可以使用 {{ 将 Vec<U> 转换为 .into(),我也无法直接使用 T 将其转换为 U 1}}。例如,此代码无法编译:

.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>>>

解决方法

具有用于转换容器的全面实现的问题(当前)是它与现有的全面实现 impl From<T> for T 相冲突。

为了解决这个问题,简而言之需要 specialization (Issue #31844)。

select * from t1 join t2 on t1.colA in split(t2.colB,',')

不久前在 Rust 论坛上讨论了同样的问题:

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...