闭包包含异步块的异步方法无法推断适当的生存期



我正在尝试使用 hyper 制作一个小型 HTTP 路由器,但我在启动服务器时遇到了一些困难。

以下功能是我遇到问题的地方。

依赖:

[dependencies]
hyper = "0.13"
tokio = { version = "0.2", features = ["full"] }
use std::net::SocketAddr;
use std::convert::Infallible;
use hyper::Server;
use hyper::service::{make_service_fn, service_fn};
use hyper::{Body, Request, Response};
#[tokio::main]
async fn main() {
let router = Router::new(SocketAddr::from(([127, 0, 0, 1], 80)));
router.start();
}
pub struct Router<'a> {
addr: SocketAddr,
}
impl<'a> Router<'a> {
pub fn new(addr: SocketAddr) -> Self {
Self {
addr,
}
}
pub async fn start(&self) {
let make_svc = make_service_fn(|_| async {
Ok::<_, Infallible>(service_fn(|req| self.route(req)))
});
let server = Server::bind(&self.addr).serve(make_svc);
println!("Listening on http://{}", self.addr);
if let Err(e) = server.await {
eprintln!("Server error: {}", e);
}
}
pub async fn route(&self, req: Request<Body>) -> Result<Response<Body>, Infallible> {
// TODO
Ok(Response::new(
"Hello, world!".into()
))
}
}

我不能使用Ok::<_, Infallible>(service_fn(self.route),因为其中一个参数是&self。我找到的解决方案的问题在于编译器无法推断出适当的生存期,我不知道如何解决它。

error: cannot infer an appropriate lifetime
--> srcmain.rs:24:24
|
24 |     pub async fn start(&self) {
|                        ^^^^^ ...but this borrow...
...
29 |         let server = Server::bind(&self.addr).serve(make_svc);
|                                               ----- this return type evaluates to the `'static` lifetime...
|
note: ...can't outlive the lifetime `'_` as defined on the method body at 24:24
--> srcmain.rs:24:24
|
24 |     pub async fn start(&self) {
|                        ^
error: aborting due to previous error

您的make_svc使用&self,但该变量仅暂时借用,直到start函数结束。服务器可能存在于start函数之外,因此它不能引用其中借用的变量。

当您对服务器等长期存在的内容使用闭包时,不能使用临时引用。请改用Arc,例如start(self: Arc<Self>)并在调用方法之前将该对象包装在Arc::new()中。

最新更新