在指定外部类型时推断内部类型
Infer inner types while specifying outer type
我有一个异步函数调用另一个异步函数,这个异步函数又调用另一个异步函数...等等
pub async fn collect_data(&mut self, arg: i32) {
let futures: Vec<T> = self
.sections
.iter_mut()
.map(|section| section.get_data(arg))
.collect();
join!(join_all(futures));
}
问题是指定 Vec<T>
;我不知道是什么(如果可以避免的话,我真的不想显式输入它,因为函数参数可能会改变)。我也无法让编译器推断类型,因为它无法弄清楚它需要将 collect() 收集到 join_all() 的 Vec 中。但是,此代码 确实 编译:
pub async fn collect_data(&mut self, arg: i32) {
let mut futures = Vec::new();
for sect in self.sections.iter_mut() {
futures.push(sect.get_data(arg));
}
join!(join_all(futures));
}
有没有办法让它用地图编译而不是创建这个可变向量?也许通过仅指定 Vec 同时仍然具有从地图的 return 值推断 T 的函数?或者其他我不知道的方式。
是的。要部分推断类型,请对希望编译器推断的部分使用 _
:
let futures: Vec<_> = self
.sections
.iter_mut()
.map(|section| section.get_data(arg))
.collect();
我有一个异步函数调用另一个异步函数,这个异步函数又调用另一个异步函数...等等
pub async fn collect_data(&mut self, arg: i32) {
let futures: Vec<T> = self
.sections
.iter_mut()
.map(|section| section.get_data(arg))
.collect();
join!(join_all(futures));
}
问题是指定 Vec<T>
;我不知道是什么(如果可以避免的话,我真的不想显式输入它,因为函数参数可能会改变)。我也无法让编译器推断类型,因为它无法弄清楚它需要将 collect() 收集到 join_all() 的 Vec 中。但是,此代码 确实 编译:
pub async fn collect_data(&mut self, arg: i32) {
let mut futures = Vec::new();
for sect in self.sections.iter_mut() {
futures.push(sect.get_data(arg));
}
join!(join_all(futures));
}
有没有办法让它用地图编译而不是创建这个可变向量?也许通过仅指定 Vec 同时仍然具有从地图的 return 值推断 T 的函数?或者其他我不知道的方式。
是的。要部分推断类型,请对希望编译器推断的部分使用 _
:
let futures: Vec<_> = self
.sections
.iter_mut()
.map(|section| section.get_data(arg))
.collect();