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 交换)?
谢谢。
某些类型可以安全地在线程之间发送,而另一些则不然。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)
您需要在使用特征对象类型的任何地方添加这些约束。
| 归档时间: |
|
| 查看次数: |
1779 次 |
| 最近记录: |