#lifetime #closures #future #async #short #shorter

short_future

为异步闭包提供更短生命周期的 Future

2 个版本

0.1.1 2024年8月16日
0.1.0 2024年8月16日

#17#short

Download history 272/week @ 2024-08-11 879/week @ 2024-08-18

1,151 每月下载量

MIT 许可证

10KB
181

短生命周期的 Future

short_future 是一个库,定义了用于处理 Future 生命周期的工具:ShortBoxFuture<'a, 'b, T> 可以同时捕获具有 'a'b 生命周期的借用。

ShortBoxFuture 通过绕过 HRTBs 和显式生命周期限制来解决限制。这在包装异步闭包时很有用,其中闭包返回的 Future 同时依赖于

  1. 封装作用域中的引用,具有生命周期 'a。
  2. 闭包参数中的引用,具有生命周期 'b。

例如,您可以编写一个辅助程序,用于重试数据库操作,其中每次重试都会创建一个新的事务,并且数据是从封装作用域中借用的

async fn run_twice<'a>(&'a self, f: F) -> anyhow::Result<()>
where F: for<'b> Fn(&'b mut Transaction) -> ShortBoxFuture<'b, 'a, anyhow::Result<()>>
{
    for i in 0..2 {
        let mut tx = self.begin();
        f(&mut tx).0.await?;
    }
    Ok(())
}

async fn go(&self) {
    let data = get_data();
    self.run_twice(|tx| async {
        tx.get(&data.id).await;
    }.into()).await
}

请参阅测试用例以获取更多示例,以及需要 ShortBoxFuture 的问题的演示。

依赖关系

~1MB
~15K SLoC