rust 如何修复“cannot return value referencing function parameter 'x' returns a value referencing data owned by the current function”中的“cannot return value referencing function parameter 'x' returns a value referencing data owned by the current function”?

xiozqbni  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(134)

我是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)返回了一个新的值,所以我不明白为什么会出现错误,如果有人能告诉我它是如何发生的以及如何修复它,那就太好了,谢谢。

e4yzc0pl

e4yzc0pl1#

错误消息可能会更有帮助。基本问题是,您试图保存对v的元素的引用-req s -但这些元素不再存在,因为您已经使用了v编译器想说的是,在v.into_iter().map(|req| ...)中,req是一个拥有的Request,当map的闭包结束时,req被丢弃(因为它是被拥有的,因为into_iter()),然后那些Future s将持有悬挂引用,编译器正确地防止了这一点。
如果您用v.iter()替换它,它将工作,因为您收集的Future现在持有对仍然存在的数据的引用;没有任何东西被消耗。

相关问题