gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:48:07 25 4
gpt4 key购买 nike

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

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,则一切正常。但是,我的用例需要我传递一个引用来代替实现我的用法(我在无限循环中使用它,因此无法将所有权传递给此函数)。我应该怎么做才能成功地将引用传递给异步函数,或者有一些设计可以避免这种情况?

最佳答案

您必须在功能测试中使用的类型定义中指定引用的生存期以及它与Future的关系。

VarIn<'a> = &'a String;
VarOut = String;
FnType<'a> = Box<dyn Fn(VarIn<'a>) -> Pin<Box<dyn Future<Output=VarOut> + 'a>>>;
这最终将无法正常工作,因为在 test中创建的字符串将被放置在函数的底部,而 &String将与Future一起返回。您可以使用 &str并使此示例工作,这就是我的建议。
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

关于asynchronous - 如何将带有引用变量的异步函数放入函数中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63073942/

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