【问题标题】:Why can't you convert containers using .into() if the elements can be converted?如果可以转换元素,为什么不能使用 .into() 转换容器?
【发布时间】:2021-05-26 18:12:28
【问题描述】:

如果我有一个Vec<T>,我无法直接使用.into() 将其转换为Vec<U>,即使我可以使用.into()T 转换为U。例如这段代码不编译:

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&lt;String, Vec&lt;Vec&lt;u32&gt;&gt;&gt; 转换为 HashMap&lt;String, Vec&lt;Vec&lt;u64&gt;&gt;&gt;

【问题讨论】:

    标签: collections rust hashmap vec


    【解决方案1】:

    使用一揽子实施转换容器的问题(当前)是它与现有的一揽子实施impl From&lt;T&gt; 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 论坛上讨论过同样的问题:

    【讨论】:

      猜你喜欢
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      • 2012-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      相关资源
      最近更新 更多