我有一个使用hyper库的程序。我希望用户能够创建一个包含内部处理HTTP连接的服务器的应用程序。
use hyper::server::conn::AddrIncoming;
use hyper::server::Server;
use hyper::service::service_fn_ok;
use std::net::SocketAddr;
pub struct App {
inner: Server<AddrIncoming, ()>,
}
impl App {
pub fn new() -> Self {
let addr = SocketAddr::from(([0, 0, 0, 0], 3000));
let inner = Server::bind(&addr).serve(|| service_fn_ok(|_req| unimplemented!()));
App { inner }
}
}
(游乐园链接)
错误就如预期的那样:
error[E0308]: mismatched types
--> src/lib.rs:15:15
|
15 | App { inner }
| ^^^^^ expected (), found closure
|
= note: expected type `hyper::server::Server<_, ()>`
found type `hyper::server::Server<_, [closure@src/lib.rs:13:47: 13:88]>`
这个文档不是很清晰,但是Server
的第二个类型参数是它使用的MakeService
类型。
我无法确定如何在inner
的类型中引用闭包。有没有一种方法可以将闭包打包以使代码编译?是否有一种手动实现MakeService
而不使用闭包的方法?
Hyper文档提到了函数make_service_fn
,它返回一个MakeServiceFn
,但是该类型不是公开的,因此我无法在inner
的类型中使用它。