我刚接触Ruust,我编写了一些异步代码来同时发送两个请求:

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);
}

但我在"req.do_req(1)"行中的迭代器"Cannot Return Value Reference函数参数req返回一个引用当前函数所拥有的数据的值"中得到一个错误.

我认为req.do_req(1)返回一个新值,所以我不能理解为什么会出现错误,如果有人能告诉我它是如何发生的以及如何修复它,那就太好了,谢谢.

推荐答案

错误消息可能会更有帮助.根本问题是,您试图保留对v的元素的引用-req,但这些元素不再存在,因为您已经通过调用v.into_iter()消耗了v(因此也消耗了它的元素).编译器试图说明的是,在v.into_iter().map(|req| ...)中,req是拥有的Request,但是您正在生成并收集到futs中的Future持有对该拥有的数据的引用.当map‘S闭包结束时,req被删除(因为它被拥有,因为into_iter()),然后这些Future将持有悬挂引用,编译器正确地阻止了这一点.

如果您将其替换为v.iter(),它将起作用,因为您收集的Future现在包含对仍然存在的数据的引用;没有任何数据被消耗.

Rust相关问答推荐

在HashMap中插入Vacant条目的可变借位问题

使用Rust s serde_json对混合数据类型进行优化'

为什么reqwest以文本形式下载二进制文件?

如何获取Serde struct 的默认实例

使用极点数据帧时,找不到枚举结果的方法lazy()

我无法理解Rust范围的定义(Rust Programming Language,第二版克拉布尼克和尼科尔斯)

关于使用平面图功能的borrow 判断器的问题

Rust面向对象设计模式

在没有任何同步的情况下以非原子方式更新由宽松原子操作 Select 的值是否安全?

为什么这个闭包没有实现Fn?

如何从trait方法返回std :: iter :: Map?

具有在宏扩展中指定的生命周期的枚举变体数据类型

在线程中运行时,TCPListener(服务器)在 ip 列表中的服务器实例之前没有从客户端接受所有客户端的请求

为什么拥有 i32 所有权的函数需要它是可变的?

如何在 C++ 和 Rust 之间共享 pthread 同步原语?

相交着色器从 SSBO 中读取零

如何为枚举中的单个或多个值返回迭代器

在 Rust 中有条件地导入?

为什么这个 Trait 无效?以及改用什么签名?

如何在 Rust 的内置函数上实现特征?