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

存储具有相同特征和不同输出类型的结构[重复]

谭锐藻
2023-03-14

我试图在Vec中存储具有共同特征的不同结构

游乐场

fn main()
{
    let p = TheirPoint ...
    let l = TheirLine ...
    let vec_shapes: Vec<Box<dyn TheirShadow>> = vec![Box::new(l), Box::new(p)];
}

impl TheirShadow for TheirPoint {
    type Output = (TheirPoint, TheirPoint);
...
}

impl TheirShadow for TheirLine {
    type Output = (TheirPoint, TheirPoint, TheirPoint, TheirPoint);
...
}

pub trait TheirShadow {
    type Output;
...
}
error[E0191]: the value of the associated type `Output` (from trait `TheirShadow`) must be specified
  --> src/main.rs:32:33
   |
32 |     let vec_shapes: Vec<Box<dyn TheirShadow>> = vec![Box::new(l), Box::new(p)];
   |                                 ^^^^^^^^^^^ help: specify the associated type: `TheirShadow<Output = Type>`
...
73 |     type Output;
   |     ------------ `Output` defined here

这可以实现吗,或者是否像在另一个问题答案中一样,集合中所有项目的所有方法的签名必须相同,以便您可以互换使用它们?


共有1个答案

危卜鹰
2023-03-14
匿名用户

由于您不知道< code>Output,您实际上不能使用返回< code>Output的函数,因为它们的大小都不同,Rust无法知道返回的是哪一个。解决这个问题最简单的方法是使用枚举:

enum Shadow {
    Tuple2(TheirPoint, TheirPoint),
    Tuple4(TheirPoint, TheirPoint, TheirPoint, TheirPoint)
}

impl TheirShadow for TheirPoint {
    type Output = Shadow;
    fn cast_shadow(self) -> Self::Output {
        Shadow::Tuple2(some_point, some_other_point)
    }
}

// and so on

您甚至可以消除输出类型,只需在trait中强制返回Shadow

 类似资料:
  • 问题内容: 我有两个成员相同,我想将一个结构复制到另一个结构,请参见下面的伪代码: 然后,我有结构的,而结构的,有什么办法复制的? 问题答案: 使用转换更改类型。以下代码使用转换将type 的值复制到type 的值: 游乐场的例子 该转换仅在基础类型,除了结构标签相同的工作。

  • 问题内容: 以下代码可以正常工作。在两个不同的结构上操作并打印该结构的字段的两种方法: 在控制台中显示所需的输出: 现在 ,如果我以以下方式更改方法签名,则会出现编译错误。我只是将方法的接收者移动到方法的参数: 我什至无法编译程序: 问 :为什么 当 方法具有相同的名称和Arity 时 ,我可以在接收器中互换结构类型,而不能在参数中互换结构类型? 问题答案: 因为Go不支持在其参数类型上重载用户定

  • 我有一个gradle android项目,有两个模块: 穿 在我的gradle配置中,我有不同的构建类型。默认设置(debug和release,每个都有自定义设置)以及dev和beta构建类型(也有自定义签名、自定义proguard和自定义applicationIdSuffix)。 我现在想做的是使用构建类型测试版(gradle清洁组件测试版)构建应用程序包。这就开始在测试版中构建应用程序,看到它

  • 问题内容: 我需要采取目前的hql: 并将其更改为 我的问题是与distinct关键字有关。它在使用新的Object查询类型的hql查询中属于什么位置。一种想法是使用子选择,让我与众不同。我试过添加,但不起作用。 问题答案: 好的,对感兴趣的人来说,正确的语法是

  • 我正在开发一个需要ML模型集成的Android应用程序。为此,我使用TensorFlow lite进行部署。我使用基于自定义模型的暹罗网络进行输出,输出形状为[1 128]。当我在Google Colab上推断python中的tf lite模型时,输出[1 128]数字与我在Android设备上产生的数字不同。输入图像在两种推断以及输入和输出形状上都是相同的,但我在Android手机和Python

  • 问题内容: 当与MySQL数据库连接时,我有几种方法可以做同样的事情,保存或加载不同类型的参数。目前,我对每种类型都有不同的方法。如何合并这些方法,以便它们支持不同的类型? 下面是两个非常相似但使用不同类型的方法的示例: 请注意,在该示例中,类型均为数字。在类型完全不同的情况下(例如int和String),如何避免使用近乎重复的方法? 问题答案: 您可以在此处应用 策略 模式。 …