我可以克隆未来吗?

zin*_*ino 3 rust rust-tokio

我想为未来编写一些通用的重试逻辑。

我知道具体的返回类型,并且想在未来重试相同的操作。

我的代码只能访问未来 - 我不想将每个 fn 调用站点包装在闭包中以启用重新创建它。

看起来“future”是 (fn, args) 的组合,当.await被调用时,它会运行并等待结果。

如果我能够克隆所有参数,是否可以创建未启动的未来的克隆,以便在第一次失败时重试?

use*_*342 5

问题在于,尚未开始的未来与已经开始的未来是同一类型——未来会就地自我转变。因此,虽然理论上 aFuture 可能Clone,但这会对它在整个生命周期中允许保持的状态施加严格的限制。对于使用 实现的 future,async fn不仅初始状态(传递给 的参数async fn)必须为Clone,而且所有交叉.await点的局部变量也必须为 。

一个简单的实验表明,当前的情况不会像它那样async自动实现,即使对于安全的异步函数也是如此。例如:CloneSend

async fn retry(f: impl Future + Clone) {
    todo!()
}

fn main() {
    // fails to compile:
    retry(async {});
    //    ^^^^^^^^ the trait `Clone` is not implemented for `impl Future`
}
Run Code Online (Sandbox Code Playgroud)

我不想将每个 fn 调用站点包装在闭包中以启用重新创建它。

在这种情况下,这可能正是您需要做的。或者如果闭包需要太多样板文件,则使用某种宏。