gpt4 book ai didi

rust - 如何指示异步函数的返回值与参数的生命周期相同?

转载 作者:行者123 更新时间:2023-12-03 11:27:50 29 4
gpt4 key购买 nike

我们可以像这样用非静态参数匹配一个普通函数:

fn processor(data: &i32) -> &i32 {
data
}

fn process<'b>(data: &'b i32, processor: impl 'static + for<'a> Fn(&'a i32) -> &'a i32) -> &'b i32 {
processor(data)
}

fn main() {
let data = 1;
println!("data: {}", process(&data, processor));
}

由于异步函数返回匿名 future ,我们不能表明匿名 future 的生命周期与参数相同:

use std::future::Future;

async fn processor(data: &i32) -> &i32 {
data
}

async fn process<'b, F>(data: &'b i32, processor: impl 'static + Fn(&i32) -> F) -> &'b i32
where
F: 'b + Future<Output = &'b i32>,
{
processor(data).await
}

async fn _main() {
let data = 1;
println!("data: {}", process(&data, processor).await);
}

编译器会报错:

error[E0271]: type mismatch resolving `for<'r> <for<'_> fn(&i32) -> impl std::future::Future {processor} as std::ops::FnOnce<(&'r i32,)>>::Output == _`
--> src/lib.rs:16:26
|
7 | async fn process<'b, F>(data: &'b i32, processor: impl 'static + Fn(&i32) -> F) -> &'b i32
| ------- - required by this bound in `process`
...
16 | println!("data: {}", process(&data, processor).await);
| ^^^^^^^ expected bound lifetime parameter, found concrete lifetime

如何匹配呢?

最佳答案

您需要声明:

  1. 闭包接受与参数具有相同生命周期的引用。
  2. 返回的 future 返回一个与参数具有相同生命周期的引用。
  3. 返回的 future 捕获与参数具有相同生命周期的引用。
async fn process<'b, F, Fut>(data: &'b i32, processor: F) -> &'b i32
where
F: Fn(&'b i32) -> Fut,
// ^^ [1]
F: 'static,
Fut: Future<Output = &'b i32> + 'b,
// ^^ [2] ^^ [3]
{
processor(data).await
}

关于rust - 如何指示异步函数的返回值与参数的生命周期相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60621816/

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