rust - 如何指示异步函数的返回值的生命周期与参数的生命周期相同?
问题描述
我们可以像这样匹配带有非静态参数的普通函数:
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));
}
由于异步函数返回匿名期货,我们不能表明匿名期货的生命周期与参数相同:
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
我怎样才能匹配它?
解决方案
你需要说明:
- 闭包接受与参数具有相同生命周期的引用。
- 返回的未来返回一个与参数具有相同生命周期的引用。
- 返回的未来捕获与参数具有相同生命周期的引用。
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
}
推荐阅读
- python - 从 3d 坐标中删除撇号和非数字字符 - python
- amazon-web-services - Azure 是否有像 AWS 的 CloudFormation 一样的 IaC 工具?
- android - 电话身份验证创建新帐户并断开 Firebase 上的链接
- mysql - Sqoop - 语法错误 - 边界查询 - “SQL 语法错误”
- javascript - 如何解决带有 TypeError 的 forEach 循环?
- php - 使用 Eloquent 获取集合后,我可以更改该集合中单个对象的位置吗?
- node.js - 如何在 socket-io 服务器中识别传入消息的用户?
- google-chrome - 从命令行打开 chrome:// URL?
- java - 如何从 DefaultMutableTreeNode 复制整数值?
- python - 用 Python 编写 Lemoine 猜想