如何在不使用where子句的情况下在枚举中使用异步闭包?
非泛型实现方案
可以用**动态分发(trait object)**替代泛型,把闭包和对应的Future都装箱,这样枚举就不需要泛型参数了。具体实现如下:
use std::future::Future; use std::pin::Pin; pub enum PreparedMigration { Simple(String), Statement(Statement), Closure(Box<dyn FnOnce(&DatabaseConnection) -> Pin<Box<dyn Future<Output = bool>>>>), }
核心说明
- 用
Box<dyn FnOnce(&DatabaseConnection) -> ...>把闭包装箱为trait object,直接消除泛型参数F - 返回的Future需要用
Pin<Box<dyn Future<Output = bool>>>装箱:因为异步逻辑生成的Future大多是匿名类型,且需要固定内存位置(Pin)才能被正确调度
使用示例
// 直接传入符合签名的闭包,自动完成装箱 let migration = PreparedMigration::Closure(Box::new(|conn| { Box::pin(async { // 这里编写数据库操作逻辑,最终返回bool结果 true }) }));
这样处理后,你就不用再纠结泛型参数的填充问题,枚举的使用会简洁很多。
内容的提问来源于stack exchange,提问作者A.J
相关产品推荐
相关产品推荐

