具有 Box 字段并隐含异步特征的 Rust 结构

geo*_*tle 5 oop traits rust async-await trait-objects

我遇到了具有 Box 字段并隐含异步特征的结构的问题。具体来说

error: future cannot be sent between threads safely
Run Code Online (Sandbox Code Playgroud)

看起来发生错误是因为我在 impl 是异步特征的结构中使用了 Box 字段。

以下是我想要完成的任务和遇到的问题的一个最小示例。你可以在这里找到它的游乐场。

error: future cannot be sent between threads safely
Run Code Online (Sandbox Code Playgroud)

首先,我该如何解决这个问题?

其次,我本质上是在尝试为结构编写特征,以便实现的结构可以轻松地与其他结构交换,类似于我在 Java 中为对象编写接口的方式。我意识到这可能不是我应该考虑 Rust 组件设计的方式,但我是一个初学者,不确定什么是基于特征的设计的正确方法。如果这不是惯用的 Rust,您将如何重新设计它,以便它仍然实现设计目标(在堆栈上下创建和使用特征以允许轻松的 impl 交换)?

谢谢。

Pet*_*all 2

某些类型可以安全地在线程之间发送,而另一些则不然。Rust 中表达这一点的方式是通过类型是否实现该Send特征。还有另一个特征,Sync它标记类型可以安全地通过引用在线程之间共享。

为了表示您的特征对象必须可以安全发送,您可以添加一个约束:

pub struct OuterStruct {
    inner_trait: Box<dyn InnerTrait + Send>,
}
Run Code Online (Sandbox Code Playgroud)

但是,OuterStruct包含对对象的引用InnerTrait,因此,如果OuterStruct在线程之间发送,则对内部特征对象的引用将同时共享。因此,对于OuterStructbe Send,执行 ifInnerTrait必须是Sync

所以它需要是:

pub struct OuterStruct {
    inner_trait: Box<dyn InnerTrait + Sync + Send>,
}
Run Code Online (Sandbox Code Playgroud)

您需要在使用特征对象类型的任何地方添加这些约束。