Terrarum::异世界丨居正博客

Recent content on Terrarum::异世界丨居正博客

马上订阅 Terrarum::异世界丨居正博客 RSS 更新: https://blog.skyju.cc/index.xml

浅谈 Rust 中如何把 Async Function 放在 HashMap 里

2025年4月30日 15:00
Featured image of post 浅谈 Rust 中如何把 Async Function 放在 HashMap 里

需求

经常会有这样的需求,需要根据具体参数的不同调用不同的处理函数。

比如根据 URL 的不同,调用不同的路由 handler;根据 command 的不同,调用不同的处理 handler。

这些需求基本都可以抽象为一件事:把 function 放在 HashMap 里。

如果是异步编程的话,那么就是把 async function 放在 HashMap 里了。

这件事在 Rust 中做起来,要比想象中困难。

今天就来浅谈一下这个主题。

框架

我们希望设计一个路由器结构体,里面放一个 HashMap。

HashMap 以 String 为 key,具体的处理函数为 value。

在初始化的时候把处理函数按不同的 key 放到 HashMap 里,调用时根据不同情况按 key 取出。

简化的话,处理函数就定为接受一个 String 并返回一个 String。

大概是这种感觉:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
use std::collections::HashMap;
use std::pin::Pin;
use std::sync::Arc;
use std::time::Duration;
use tokio::sync::RwLock;
use tokio::time::sleep;

type HandlerFn = // TODO 需要写一个 Handler 的具体类型
#[derive(Default, Clone)]
struct Router {
    table: Arc<RwLock<HashMap<String, HandlerFn>>>,
}
impl Router {
    // TODO 需要一个 add 函数
    // async fn add
}
#[tokio::main]
async fn main() {
    let mut router = Router::default();
    router.add("handler1...

剩余内容已隐藏

查看完整文章以阅读更多