【发布时间】:2019-10-21 11:54:28
【问题描述】:
我有一个在内部使用 hyper 的库。我希望用户能够创建一个 App,其中包含一个内部处理 HTTP 连接的 Server。
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,而不是使用闭包?
超文档引用了函数make_service_fn,它返回一个MakeServiceFn,但是类型不是公开的,所以我不能在inner的类型中使用它。
【问题讨论】:
-
看来How do I store a closure in a struct in Rust? 的答案可能会回答您的问题。如果没有,请edit您的问题来解释差异。否则,我们可以将此问题标记为已回答。
-
TL;DR 副本:是的,将闭包或包含闭包的东西装箱,并创建一个装箱的 trait 对象。
-
我了解盒装特征对象的一般工作原理,但我不确定如何将它们应用于我遇到的问题。盒装封口应该有什么类型?具体来说,返回类型是什么?
-
@muskox 你解决了吗?我有同样的问题。