generics - trait 不能做成一个对象

标签 generics rust traits dynamic-dispatch trait-objects

我有以下代码:

extern crate futures; // 0.1.24

use futures::Future;
use std::io;

struct Context;

pub trait MyTrait {
    fn receive(context: Context) -> Future<Item = (), Error = io::Error>;
}

pub struct MyStruct {
    my_trait: MyTrait,
}

当我尝试编译它时,我收到错误消息:

error[E0038]: the trait `MyTrait` cannot be made into an object
  --> src/lib.rs:13:5
   |
13 |     my_trait: MyTrait,
   |     ^^^^^^^^^^^^^^^^^ the trait `MyTrait` cannot be made into an object
   |
   = note: method `receive` has no receiver

我想我知道为什么会这样,但我如何从结构中引用特征?是否可以?也许还有其他方法可以实现相同的行为?

最佳答案

您可以将类型参数添加到您的结构中,如 Zernike's answer ,或使用特征对象。

使用类型参数可以提高性能,因为 T 的每个值都将创建该结构的专门副本,从而允许静态分派(dispatch)。特征对象使用动态分配,因此它允许您在运行时交换具体类型。

特征对象方法如下所示:

pub struct MyStruct<'a> {
    my_trait: &'a dyn MyTrait,
}

或者这个:

pub struct MyStruct {
    my_trait: Box<dyn MyTrait>,
}

但是,在您的情况下,MyStruct 不能成为对象,因为 receive 是静态方法。您需要将其更改为将 &self&mut self 作为其第一个参数才能起作用。还有other restrictions .

关于generics - trait 不能做成一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45116984/

相关文章:

gdb - 在 Visual Studio Code 中使用 gdb 调试 Rust 时未命中断点

rust - 为什么 impl trait 不能用于返回多个/条件类型?

perl - 如何设置 AoArrayrefs 属性并从标量强制转换为 arrayref?

Java 泛型 - 为什么 <Object> = new <specialization> 不允许?

java - 泛型 List<String> 和 List<Integer> 未按预期运行

c++ - Rust 中从 extern "C"方法返回动态字符串以供 C 或 C++ 使用的最佳方法

rust - 如何将可变引用传递给属于该引用的对象上的方法?

java - 提取泛型类的字段

Java泛型通配符问题

generics - 如何为对特征本身的关联类型的引用编写特征绑定(bind)?