我是rust的新手,我写了一些javascript代码来并发发送两个请求:
use std::time::Duration;
use futures::future::join_all;
use tokio::time::sleep;
// #[derive(Clone, Debug)]
pub struct Request {}
impl Request {
pub async fn do_req(&self , num : i32) -> i32 {
sleep(Duration::from_secs(1)).await;
num * 2
}
}
#[tokio::test]
async fn test() {
let v = vec![Request{} , Request{}];
let futs : Vec<_> = v.into_iter().map(|req|{
req.do_req(1)
}).collect();
let res = join_all(futs).await;
println!("{:?}", res);
}
字符串
但是我在迭代器中得到一个错误“cannot return value referencing function parameter req
returns a value referencing data owned by the current function”在“req.do_req(1)"行中。
我认为req.do_req(1)返回了一个新的值,所以我不明白为什么会出现错误,如果有人能告诉我它是如何发生的以及如何修复它,那就太好了,谢谢。
1条答案
按热度按时间e4yzc0pl1#
错误消息可能会更有帮助。基本问题是,您试图保存对
v
的元素的引用-req
s -但这些元素不再存在,因为您已经使用了v
编译器想说的是,在v.into_iter().map(|req| ...)
中,req
是一个拥有的Request
,当map
的闭包结束时,req
被丢弃(因为它是被拥有的,因为into_iter()
),然后那些Future
s将持有悬挂引用,编译器正确地防止了这一点。如果您用
v.iter()
替换它,它将工作,因为您收集的Future
现在持有对仍然存在的数据的引用;没有任何东西被消耗。