Quero armazenar algumas operações aysnc em um hashmap. Em seguida, obtenha uma lista de operações assíncronas com base na lista de strings de entrada do usuário. Pesquisando no site, encontrei esta pergunta
Como posso colocar uma função assíncrona em um mapa no Rust?
A diferença é que eu quero usar o hashmap da operação armazenada em diferentes threads do Tokio. Então eu reescrevo com once_cell + RwLock.
static MAPS: Lazy<Arc<RwLock<HashMap<&'static str, CalcFn>>>> = Lazy::new(|| {
let map = Arc::new(RwLock::new(HashMap::new()));
let mut map_lock = map.write().unwrap();
map_lock.insert(
"add",
Box::new(
move |a: i32, b: i32| -> Pin<Box<dyn Future<Output = BoxedResult<i32>>>> {
Box::pin(add(a, b))
},
) as CalcFn,
);
map_lock.insert(
"sub",
Box::new(
move |a: i32, b: i32| -> Pin<Box<dyn Future<Output = BoxedResult<i32>>>> {
Box::pin(sub(a, b))
},
) as CalcFn,
);
map.clone()
});
A inicialização lenta parece chata e ocupa muitas linhas de código porque posso ter mais de 20 operações assíncronas.
Alguém poderia gentilmente oferecer alguns comentários para escrever este exemplo de uma forma "mais limpa"?