当前位置: 首页 > 知识库问答 >
问题:

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

温凯
2023-03-14

如果我有一个Vec

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,它会节省很多繁琐的代码


共有1个答案

司徒杜吟
2023-03-14

(目前)具有用于转换容器的总括实现的问题是,它与现有的总括实现impl from冲突

要想绕过这一点,简言之,需要专业化(第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论坛也讨论了同样的问题:

  • 将迭代器转换为一揽子实现

 类似资料:
  • 问题内容: Java (可能还有许多其他类)内部发生的事情是有一个内部对象,对象被写入其中。每当从元素中读取元素时,都会进行转换。因此,每次读取时都要进行转换。 我不知道为什么要这样做。对我来说,似乎他们只是在做不必要的演员。只创建一个,然后不进行强制转换,是否更合乎逻辑,并且速度稍快一些?每次阵列创建仅一次强制转换,通常 远 少于读取次数。 为什么首选他们的方法?我看不出为什么我的想法并不严格吗

  • 问题内容: 所以这工作: 但这不是: 总而言之,我得到了第一部分(拳击),但是我发现第二部分不起作用是非常不直观的。是否有特定的原因(除了String从Object继承而int不从Object继承)? 编辑: 为了完善我的问题,这也可以: 但是,以下内容却没有: 令人惊讶的是,您遇到了与String相同的问题: 在最后一行产生类强制转换异常。仍然有效: 问题答案: 我刚刚找到了我正在寻找自己的答案

  • 我在尝试编译项目时出现了这个错误:

  • 获取以下错误: 请帮我把结果设置到这个BO类中。

  • 在我的Oracle数据库中,我有存储为VARCHAR的数量值。从数据库中检索记录时,我希望将它们映射到一个POJO,其中金额值表示为double。不幸的是,我不能使用强制类型,因为在数据库中,所有内容都存储为VARCHAR,并且没有模式将列标识为包含金额值的列。 我正在查看jOOQ转换器,这似乎是我想要的。因此,我为此创建了一个jOOQ转换器: 然而,每当我想使用将数据库记录映射到我的POJO时,

  • 给定一个包含有效正则表达式的条目的“字典”,例如: 在python中,我如何将每个条目或“字典值”分离到它自己的行上?我不能简单地用拆分,因为如果您将一个条目值视为本身,,这将破坏该值,因为它包含相同的字符。 我不仅仅是想匹配这些角色,我还想替换它们。