为hyper
编写异步路由器时,我无法处理异步功能。
此代码:
use std::collections::HashMap;
use std::future::Future;
type BoxedResult<T> = Result<T,Box<dyn std::error::Error + Send + Sync>>;
type CalcFn = Box<dyn Fn(i32,i32) -> dyn Future<Output = BoxedResult<i32>>>;
async fn add(a: i32,b: i32) -> BoxedResult<i32> {
Ok(a + b)
}
async fn sub(a: i32,b: i32) -> BoxedResult<i32> {
Ok(a - b)
}
fn main() {
let mut map: HashMap<&str,CalcFn> = Default::default();
map.insert("add",Box::new(add));
map.insert("sub",Box::new(sub));
println!("map size: {}",map.len());
}
生成以下编译器错误:
error[E0271]: type mismatch resolving `<fn(i32,i32) -> impl std::future::Future {add} as std::ops::FnOnce<(i32,i32)>>::Output == dyn std::future::Future<Output = std::result::Result<i32,std::boxed::Box<dyn std::error::Error + std::marker::Send + std::marker::Sync>>>`
--> src/main.rs:17:23
|
17 | map.insert("add",Box::new(add));
| ^^^^^^^^^^^^^ expected opaque type,found trait std::future::Future
|
= note: expected type `impl std::future::Future`
found type `dyn std::future::Future<Output = std::result::Result<i32,std::boxed::Box<dyn std::error::Error + std::marker::Send + std::marker::Sync>>>`
= note: required for the cast to the object type `dyn std::ops::Fn(i32,i32) -> dyn std::future::Future<Output = std::result::Result<i32,std::boxed::Box<dyn std::error::Error + std::marker::Send + std::marker::Sync>>>`
error[E0271]: type mismatch resolving `<fn(i32,i32) -> impl std::future::Future {sub} as std::ops::FnOnce<(i32,std::boxed::Box<dyn std::error::Error + std::marker::Send + std::marker::Sync>>>`
--> src/main.rs:18:23
|
18 | map.insert("sub",Box::new(sub));
| ^^^^^^^^^^^^^ expected opaque type,std::boxed::Box<dyn std::error::Error + std::marker::Send + std::marker::Sync>>>`
impl Future
和dyn Future
之间似乎存在冲突,但我不知道如何处理。