在编写异步 Rust 代码时,我经常遇到一种模式。假设我有一个Foo结构(在实际代码中,这可能类似于网络客户端)和一个异步函数,该函数引用该结构的实例:
struct Foo {
i: i32
}
async fn use_foo(foo: &Foo) -> () {
// do something with foo
}
Run Code Online (Sandbox Code Playgroud)
然后,我想use_foo同时运行几个,每个都有自己对不同Foo. 一种自然的(但不正确的)方法是:
use futures::stream::FuturesUnordered;
async fn foo_in_a_loop() {
let futures = FuturesUnordered::new();
for i in 0..10 {
let foo = Foo { i };
// does not compile: `foo` is dropped before the future is dropped
futures.push(use_foo(&foo));
}
}
Run Code Online (Sandbox Code Playgroud)
不能编译:
error[E0597]: `foo` does not live long enough
--> src/main.rs:53:30
|
53 | …Run Code Online (Sandbox Code Playgroud) rust ×1