首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将带有引用变量的异步函数放入函数中?

如何将带有引用变量的异步函数放入函数中?
EN

Stack Overflow用户
提问于 2020-07-24 20:51:26
回答 1查看 127关注 0票数 0

标题应该已经提示您,我已经注意到How can I put an async function into a map in Rust?,并且我无法继续我的工作。以下是基于上述链接的示例代码:

代码语言:javascript
复制
extern crate async_std;
use async_std::task;
use std::future::Future;
use std::pin::Pin;
use std::boxed::Box;

type VarIn = &String;
type VarOut = String;
type FnType = Box< dyn Fn(VarIn) -> Pin<Box<dyn Future<Output=VarOut>>> >;

async fn test(v: FnType) {
    println!("{}", v("hi".to_string()).await)
}

async fn var(s: &String) -> String {
    format!("var:{}", s)
}

fn main() {
    task::block_on(test(Box::new(|s| Box::pin(var(s)))));
}

如果将VarIn替换为String而不是&String,那么一切都很好。然而,我的用例需要我传递一个引用来实现我的使用(我在无限循环中使用它,所以我不能将所有权传递给这个函数)。我应该怎么做才能成功地传递对异步函数的引用,或者有一些设计可以绕过这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-25 06:23:30

您必须在函数测试中使用的类型定义中指定引用的生命周期以及它与Future的关系。

代码语言:javascript
复制
VarIn<'a> = &'a String;
VarOut = String;
FnType<'a> = Box<dyn Fn(VarIn<'a>) -> Pin<Box<dyn Future<Output=VarOut> + 'a>>>;

这最终是行不通的,因为在test中创建的字符串将被放在函数的底部,而&String将随Future一起返回。您可以使用&str并让这个示例工作,这就是我建议的。

代码语言:javascript
复制
VarIn<'a> = &'a str
VarOut = String
FnType<'a> = Box<dyn Fn(VarIn<'a>) -> Pin<Box<dyn Future<Output=VarOut> + 'a>>>;

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=d86d8b57b556c3d4c4e0282f890a2228

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

https://stackoverflow.com/questions/63073942

复制
相关文章

相似问题

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