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

性状相关类型的多态结构载体

田修为
2023-03-14

我试图理解多态性在使用具有关联类型的特征时是如何工作的。请考虑以下特征:

trait Animal {
    fn talk (&self);
}

此特征由以下结构使用:

struct Dog;
struct Cow;

impl Animal for Dog {
    fn talk (&self) {
        println!("Woof");
    }
}

impl Animal for Cow {
    fn talk (&self) {
        println!("Moo");
    }
}

然后我在一个向量上循环

fn main() {
    let animals: Vec<&Animal> = vec![&Dog, &Cow];
    for animal in &animals {
        animal.talk();
    }
}
// output:
// Woof
// Moo

到目前为止还不错。现在,我将关联的类型Food添加到trait(该类型未使用,但仅用于最小的重现)。

struct Meat;
struct Herb;

trait Animal {
    type Food;
    ...
}
impl Animal for Dog {
    type Food = Meat;
    ...
}
impl Animal for Cow {
    type Food = Herb;
    ...
}

现在我得到错误:

error[E0191]: the value of the associated type `Food` (from trait `Animal`) must be specified
   --> src/main.rs:188:23
163 |     type Food;
    |     ---------- `Food` defined here
...
188 |     let animals: Vec<&Animal> = vec![&Dog, &Cow];
    |                       ^^^^^^ help: specify the associated type: `Animal<Food = Type>`

但在这种情况下,我不能只关注错误消息,因为实现trait动物结构的数量不应该是静态的。

解决这个问题的最好方法是什么?预先感谢


共有1个答案

沈永贞
2023-03-14

这是运行时多态性(特征对象)的固有限制:您不知道具体类型,因此无法知道其关联类型。

如果你想创建一个可以调用.talk()的东西的向量,那么很容易为这个(playground)创建一个特征:

trait Talk {
    fn talk(&self);
}

impl<A: Animal> Talk for A {
    fn talk(&self) {
        Animal::talk(self);
    }
}

let animals: Vec<&dyn Talk> = vec![&Dog, &Cow];

您将无法编写任何通过

  • 为什么trait中的泛型方法需要trait对象的大小?
  • 什么使某物成为“特征对象”?
  • 无法创建多态类型,因为trait无法制成对象

您可以创建一个具有相同关联类型的trait对象,比如< code>dyn Animal

²使用编译时多态性(泛型),您可以编写泛型的代码,而不是任何Food类型的动物。但是您不能将不同编译时类型的东西放在Vec中,所以这也没有帮助。

 类似资料:
  • 问题内容: 阅读了有关在地图中使用切片的相关问题之后,我对Go中的相等性感到好奇。 我知道有可能重写Java方法。有没有类似的方法来定义Go如何检查用户定义的类型/结构是否相等?如果是这样,将有一个针对上述问题的解决方法。我以为使用值可能会提供解决方案,但我收到了错误消息。 问题答案: Go支持相等性检查结构。 它不能与指针字段一起使用(按照您想要的方式),因为指针地址不同。 您无法修改相等运算符

  • 本文向大家介绍JavaScript类型相关的常用操作总结,包括了JavaScript类型相关的常用操作总结的使用技巧和注意事项,需要的朋友参考一下 js的基本数据类型有哪些? ECMAScript中有5中简单数据类型(也称为基本数据类型): Undefined、Null、Boolean、Number和String。还有1中复杂的数据类型————Object,Object本质上是由一组无序的名值对组

  • 问题内容: 我正在使用Swift 4并尝试解析一些JSON数据,这些数据显然在某些情况下对于同一键可能具有不同的类型值,例如: 和 我实际上坚持定义我的名字,因为我不知道如何处理这种情况,因为 抛出,自然, 相应地抛出。 定义我时如何处理这种(和类似的)情况? 问题答案: 尝试对Reddit列表JSON响应上的“已编辑”字段进行解码/编码时遇到了相同的问题。我创建了一个结构,该结构表示给定键可能存

  • 问题内容: 例如,如果我的数据库中有以下表格,并且“学生和课程”具有多对多关系。 现在,如果我的模型如下 和 所以我的问题是,如果我仅创建这两个bean,我会遇到什么样的问题?我将面对什么样的问题以及在哪种情况下?并请为这么多对多的关系指定正确的bean结构。 问题答案: 您会遇到什么问题: 您将无法看到“学生-课程”关联 您将无法从课程导航到该课程的学生(反之亦然) 如果学生/课程表中有学生/课

  • 什么叫关联线上课堂? 答: 基于中国大学 MOOC平台,利用慕课堂教学工具进行备课并开展 课堂教学,可汇总线上课程(mooc或spoc)的学习数据,称为 关联线上课堂,简称关联课堂。 什么叫独立线下课堂? 答: 基于中国大学 MOOC平台,不使用mooc或spoc课程,仅利用慕 课堂教学工具进行备课并开展课堂教学,称为独立线下课堂,简 称独立课堂。 哪些学校可以使用关联线上课堂? 答: 您所在的学