我遇到了具有 Box 字段和 impl 异步特征的结构的问题。具体来说
error: future cannot be sent between threads safely
看起来发生错误是因为我在 impl 是异步特征的结构中使用了 Box 字段。
以下是我要完成的工作和遇到的问题的一个最小示例。你可以在这里找到它的游乐场。
use async_trait::async_trait;
// My traits
#[async_trait]
pub trait InnerTrait {
async fn inner_fn(&self) -> Result<(), ()>;
}
#[async_trait]
pub trait OuterTrait {
async fn outer_fn(&self) -> Result<(), ()>;
}
// My structs
pub struct InnerStruct {}
impl InnerStruct {
pub fn new() -> impl InnerTrait {
InnerStruct {}
}
}
pub struct OuterStruct {
inner_trait: Box<dyn InnerTrait>,
}
impl OuterStruct {
pub fn new(inner_trait: Box<dyn InnerTrait>) -> impl OuterTrait {
OuterStruct { inner_trait }
}
}
// My trait impls
#[async_trait]
impl InnerTrait for InnerStruct {
async fn inner_fn(&self) -> Result<(), ()> {
println!("InnerStruct.inner_fn");
Ok(())
}
}
#[async_trait]
impl OuterTrait for OuterStruct {
async fn outer_fn(&self) -> Result<(), ()> {
println!("OuterStruct.outer_fn");
self.inner_trait.inner_fn().await;
Ok(())
}
}
#[tokio::main]
async fn main() {
let inner_trait: Box<dyn InnerTrait> = Box::new(InnerStruct::new());
let outter_trait: Box<dyn OuterTrait> = Box::new(OuterStruct::new(inner_trait));
outter_trait.outer_fn().await;
}
首先,我该如何解决这个问题?
其次,我本质上是在尝试为结构编写特征,以便可以轻松地将 impl'ing 结构与其他结构交换出来,类似于我在 Java 中为对象编写接口的方式。我意识到这可能不是我在 Rust 中考虑组件设计的方式,但我是一个初学者,不确定什么是处理基于 trait 的设计的正确方法。如果这不是惯用的 Rust,您将如何重新设计它以使其仍能实现设计目标(在堆栈上下创建和使用特征以允许简单的 impl 交换)?
谢谢。