[Rust] 如何将async fn 保存到HashMap

简单的保存一个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。改成用函数或宏包装一下也许可以,但没什么意义;

第二个问题,可以声明一个枚举型包装函数的参数,有几种情况就有多少个项,调用的时候在函数里面根据传过来的类型解出来做处理即可;

多谢,受教了