首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >传递给异步回调的引用的生存期

传递给异步回调的引用的生存期
EN

Stack Overflow用户
提问于 2022-05-12 23:10:14
回答 2查看 169关注 0票数 2

我有异步函数,将异步回调传递给它。回调将引用作为参数。

代码语言:javascript
复制
use core::future::Future;

async fn foo(bar: &u32) {}

async fn baz<F, Fut>(f: F)
where
    F: FnOnce(&u32) -> Fut,
    Fut: Future<Output = ()>,
{
    let test: u32 = 42;
    f(&test).await;
}

#[tokio::main]
async fn main() {
    baz(foo).await;
}

如果我试图构建这个(游乐场),我会得到以下错误:

代码语言:javascript
复制
error[E0308]: mismatched types
  --> src/main.rs:16:5
   |
16 |     baz(foo).await;
   |     ^^^ lifetime mismatch
   |
   = note: expected associated type `<for<'_> fn(&u32) -> impl Future<Output = ()> {foo} as FnOnce<(&u32,)>>::Output`
              found associated type `<for<'_> fn(&u32) -> impl Future<Output = ()> {foo} as FnOnce<(&u32,)>>::Output`
   = note: the required lifetime does not necessarily outlive the empty lifetime
note: the lifetime requirement is introduced here
  --> src/main.rs:7:24
   |
7  |     F: FnOnce(&u32) -> Fut,
   |                        ^^^

据我所知,它对这篇推荐信的一生并不满意。但是,我不明白为什么。

  • 我们借用“测试”
  • 我们执行回调f(即"foo")
  • 在f完成之前,baz退出是没有办法的。

因此,看来借款没有办法比宣布测试的地方更长久。

我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-12 23:42:55

foo() 有一个隐藏的生命回归的未来。设计的签名就像:

代码语言:javascript
复制
fn foo<'a>(bar: &'a u32) -> impl Future<Output = ()> + 'a {
    async move {}
}

这样做是为了使函数能够跨bar点保存.await。遗憾的是,它的意思是函数不能满足baz()的界限。错误被混淆,因为生存期是隐藏的,但这正是编译器试图告诉您的:绑定应该类似于where F: for<'a> FnOnce(&'a u32) -> impl Future<Output = ()> + 'a,但在当前的Rust中您不能表达这一点。

有关更多和潜在的解决方案,请参见例如:

票数 3
EN

Stack Overflow用户

发布于 2022-05-13 00:01:01

只是为了解决问题,您可以使用Box而不是引用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72222940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档