You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 18:52:05