pub trait GenericAsyncRunner{
    fn return_run_function(&self) -> ?;
}
pub enum AsyncRunError{}


pub struct SpecificAsyncRunner{}

impl SpecificAsyncRunner{
    async fn run(&self) -> Result<u32, AsyncRunError> {
        todo!()
    }
}

impl GenericAsyncRunner for SpecificAsyncRunner {
    fn return_run_function(&self) -> ? {
        todo!()
    }
}

我想在运行时得到一个指向async run函数的指针.实际上,我要let generic_async_runner = Box<dyn GenericAsyncRunner>,我要generic_async_runner.return_run_function().await.我可能会沮丧,但在实践中会有很多不同的SomethingAsyncRunner,所以沮丧只能试着对所有人都沮丧.

我可以将async fn run() -> Result<u32, AsyncRunError>重写为返回Future的go 糖化版本吗?通过这种方式,我可以在上面的代码中输入一个具体的类型?.

推荐答案

async个函数还不能在traits中指定,你的例子就是其中一个重要原因.你最好的 Select 是退回Box<dyn Future<Output=T>>箱,或者使用async-trait箱.

问题是,对于可在特征对象上调用的方法,该方法需要为其每个实现返回exact same type,以便调用方知道如何使用返回的对象,例如为其分配多少字节.

然而,从async个函数返回的future 是唯一的,并且非常不透明.它们与函数的编译方式密切相关.async fn foo()返回的future 可能与async fn bar()返回的future 极为不同,这取决于它们的功能体;例如,一个可能需要比另一个持有更多的状态.

拳击的future 是解决这一问题的主要途径.通过这样做,访问和执行future 所需的信息是可用的,并在运行时查询,因此不同的trait实现可以在不 destruct 事物的情况下返回不同的future .由于分配开销,这不是很好,但对于一个复杂的问题来说,这是一个可以接受的解决方案.

Rust相关问答推荐

为什么要在WASM库中查看Rust函数需要`#[no_mangle]`?

通过解引用将值移出Box(以及它被脱糖到什么地方)?

如何编写一个以一个闭包为参数的函数,该函数以另一个闭包为参数?

获取与父字符串相关的&;str的原始片段

失真图像图形捕获Api

如何在Rust中缩短数组

仅发布工作区的二进制 crate

通过mem::transmute将数组展平安全吗?

注释闭包参数强调使用高阶排定特征界限

全面的 Rust Ch.16.2 - 使用捕获和 const 表达式的 struct 模式匹配

如何连接 Rust 中的相邻切片

如何获得对数组子集的工作可变引用?

我如何将 google_gmail1::Gmail> 传递给线程生成?

如何获取包裹在 Arc<> 和 RwLock<> 中的 Rust HashMap<> 的长度?

在 Rust 中枚举字符串的最佳方式? (字符()与 as_bytes())

您如何使用枚举反序列化字符串,其中任何其他值反序列化为新类型变体同时保留字符串?

为什么我可以从读取的可变自引用中移出?

发布方法 query_builder::QueryFragment / query_builder::QueryFragment 出错

在派生宏中使用枚举字段

Rust 坚持认为可克隆 struct 的泛型参数也必须实现 Clone