以下代码无法编译通过, 原因是函数的类型表达不能用impl Trait
use std::process::Output;
use std::future::Future;
fn main(){
let mut v: Vec<fn()->impl Future<Output=()>> = vec![];
v.push(haha);
}
async fn haha(){
println!("haha");
}
那么请教一下, 要怎么样改写vector的类型声明呢?
1
共 6 条评论, 1 页
评论区
写评论https://www.reddit.com/r/rust/comments/drtxbt/question_how_to_put_async_fn_into_a_map/f6lb4wt/ 目前为止最好的 workround 了
好像目前没办法做,不然 hyper/acitx-web 之类的就能实现异步 router 了,不过还是坐等大佬实现(反正这个问题我搞了两天,放弃了,rust 自己类型系统不全的问题)
1.vec![] 要求类型一致和编译时大小可知
2.类型一致: async 使用 Future ,Output= 应该和异步函数返回类型一致 3.编译时大小: 使用Box指针,因为指针大小是确定的32bit 或 64bit 4.因为async实现的原因,需要pin来禁止move
好像不行,因为rust对于每个async函数会实现future,然后函数签名就不同了。
错误是
感谢大佬!!!!! 不过在这里有个疑问, 我之前试了Vec<fn() -> Box<dyn Future<Output = ()>>, 但是不行,
说是"不透明类型", 所以
fn()->()
这种写法就是所谓的不透明类型吗? 是因为这种表示法不是大小固定的吗?对以下内容的回复:
async fn haha() { println!("haha"); }
async fn hahaha() { println!("hahaha"); }
fn main() { let mut v: Vec<Pin<Box<dyn Future<Output = ()>>>> = vec![]; v.push(Box::pin(haha())); v.push(Box::pin(hahaha())); task::block_on(async { for func in v { func.await } }) }