+
 新版

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

jaakan 发布于 2023/01/10 23:27
阅读 1K+
收藏 0

简单的保存一个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()

}

 

 

加载中
0
wei2011
wei2011

最近也刚刚尝试用rust的tokio写点东西,试着回答一下:

第一个问题好像不好简化了,它就是要传个闭包进去,闭包返回一个future,取出后再调用再调它的await。改成用函数或宏包装一下也许可以,但没什么意义;

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

 

jaakan
jaakan
多谢,受教了
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部