简单的保存一个async fn到HashMap的一个方法如下:
use std::collections::HashMap;
use std::future::Future;
use std::pin::Pin;
/// 将async fn 保存到HashMap中
type CalcFn = Box<dyn Fn(i32, i32) -> Pin<Box<dyn Future<Output = i32>>>>;
#[tokio::test]
async fn test1() {
let mut map: HashMap<&str, CalcFn> = Default::default();
map.insert("add", Box::new(|a, b| Box::pin(add(a, b))));
map.insert("sub", Box::new(|a, b| Box::pin(sub(a, b))));
// 自Map中取出 async fn 并执行
let add_fn = map.get("add").unwrap();
assert_eq!(3_i32, add_fn(1_i32, 2_i32).await);
}
async fn add(a: i32, b: i32) -> i32 {
a + b
}
async fn sub(a: i32, b: i32) -> i32 {
a - b
}
但是面临两个问题请教如何解决:
1. map.insert("add", Box::new(|a, b| Box::pin(add(a, b)))); 中 value部分如何简写?
2. 如何应对map中保存的多个async fn 出入参数不一致的情况,比如:
async fn add(a: i32, b: i32) -> i32 {
a + b
}
async fn say_hello() -> String {
"hello".to_string()
}
回答
最近也刚刚尝试用rust的tokio写点东西,试着回答一下:
第一个问题好像不好简化了,它就是要传个闭包进去,闭包返回一个future,取出后再调用再调它的await。改成用函数或宏包装一下也许可以,但没什么意义;
第二个问题,可以声明一个枚举型包装函数的参数,有几种情况就有多少个项,调用的时候在函数里面根据传过来的类型解出来做处理即可;
多谢,受教了
发表评论