在Rust中如何将异步Future存入Vec并通过迭代器collect生成?
问题原因
你遇到的编译报错核心有两个层面:
collect()是泛型方法,编译器无法仅通过后续的join_all调用推断出你需要把迭代器输出收集为Vec类型,缺少必要的类型提示。- 如果后续你需要在同一个
Vec中存放不同类型的Future,还需要对Future做类型擦除,转为动态分发的trait对象。
解决方案
方案1:简单类型提示(仅适用于所有Future类型完全一致的场景)
你代码里所有Future都来自同一个MyStruct::get异步方法,类型天然统一,只需要给collect加turbofish语法指定收集为Vec即可,无需修改其他逻辑:
let async_vec = socket.iter().map(|x| MyStruct::get(*x)).collect::<Vec<_>>();
替换你注释的那行代码即可正常编译运行,支持任意数量的Socket地址输入。
方案2:通用动态装箱(适用于Future类型不统一的场景)
如果你后续需要在同一个Vec中放入不同异步方法返回的Future,就需要把每个Future装箱为 trait 对象,首先引入必要的依赖:
use std::future::Future; use std::pin::Pin;
然后修改收集逻辑如下:
let async_vec: Vec<Pin<Box<dyn Future<Output = Result<MyStruct, Box<dyn std::error::Error>>> + Send>>> = socket .iter() .map(|x| Box::pin(MyStruct::get(*x))) .collect();
如果你使用的current_thread runtime不需要跨线程传递Future,可以去掉+ Send约束降低限制。
内容的提问来源于stack exchange,提问作者AlexKing
相关产品推荐
相关产品推荐

