gpt4 book ai didi

rust - 当我想将所有权传递给函数时,调用采用引用的异步 Rust 函数的惯用方法

转载 作者:行者123 更新时间:2023-12-05 09:28:50 28 4
gpt4 key购买 nike

在编写异步 Rust 代码时,我经常遇到一种模式。假设我有一个 Foo 结构(在实际代码中,这可能类似于网络客户端)和一个引用该结构实例的异步函数:

struct Foo {
i: i32
}

async fn use_foo(foo: &Foo) -> () {
// do something with foo
}

然后,我想同时运行多个 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));
}
}

不编译:

error[E0597]: `foo` does not live long enough
--> src/main.rs:53:30
|
53 | futures.push(use_foo(&foo));
| ^^^^ borrowed value does not live long enough
54 | }
| - `foo` dropped here while still borrowed
55 | }
| - borrow might be used here, when `futures` is dropped and runs the `Drop` code for type `FuturesUnordered`
|
= note: values in a scope are dropped in the opposite order they are defined

For more information about this error, try `rustc --explain E0597`

我的问题归结为:修复此错误最惯用的方法是什么?我想“强制”use_foo 获取 的所有权Foo 实例。

现在,我正在使用一个获取 foo 所有权的辅助函数:

async fn use_foo_owned(foo: Foo) -> () {
use_foo(&foo).await
}

async fn foo_in_a_loop_owned() {
let futures = FuturesUnordered::new();
for i in 0..10 {
let foo = Foo { i };
futures.push(use_foo_owned(foo));
}
}

它确实可以编译,但是为了取悦借用检查器而引入一个额外的函数是笨拙的。

请注意,有时 use_foo 可能来自另一个箱子,我可能无法更改其签名,但如果有涉及修改 use_foo 的优雅解决方案,我我也感兴趣。

最佳答案

使用 async move {} block 创建一个获取 foo 所有权并调用 use_foo 的 future:

futures.push(async move { use_foo(&foo).await });

关于rust - 当我想将所有权传递给函数时,调用采用引用的异步 Rust 函数的惯用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71070109/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com