gpt4 book ai didi

rust - 使用hyper关闭的Rust生命周期

转载 作者:行者123 更新时间:2023-12-03 11:35:33 29 4
gpt4 key购买 nike

conn传递给request_handler时一直学习使用rust ,并且存在生命周期问题。我说错了

error[E0312]: lifetime of reference outlives lifetime of borrowed content...
--> src/main.rs:33:70
|
33 | let request_handler = |req: Request<Body>| async { request_handler(conn, req).await };
| ^^^^
|
= note: ...the reference is valid for the static lifetime...

但是我不确定如何使用闭包来处理生命周期,以及为什么/如何是静态的。我对生命周期和借贷有一个松散的理解,但这似乎是一个更复杂的案例。我也不会使用闭包,但是其中一个闭包的返回类型具有的类型不会由 super 包装箱导出,因此我不知道如何在不声明返回类型的情况下创建 fn

我也可以确认是否删除传递的 conn我可以使一切正常工作,但是我想在 conn中使用 request_handler对象。
use hyper::server::conn::AddrStream;
use hyper::service::make_service_fn;
use hyper::Version;
use hyper::{Body, Error, Method, Request, Response, Server};
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
mod http_models;
mod utils;
use hyper::service::service_fn;

async fn request_handler(
conn: &'static AddrStream,
req: Request<Body>,
) -> Result<Response<Body>, hyper::Error> {
println!("req: {:?}", req);
if req.method() == Method::CONNECT {
println!("Connect")
}
let res: Response<Body> = Response::builder()
.status(200)
.version(Version::HTTP_11)
.body(Body::empty())
.unwrap();
return Ok(res);
}

#[tokio::main]
async fn main() -> Result<(), Error> {
let ip = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));
let addr = SocketAddr::new(ip, 1337);
//let client = Client::new();

let make_service = make_service_fn(|conn: &AddrStream| async {
let request_handler = |req: Request<Body>| async { request_handler(conn, req).await };
let service = service_fn(request_handler);
Ok::<_, Error>(service)
});

let server = Server::bind(&addr).serve(make_service);

println!("Listening on http://{}", addr);

if let Err(e) = server.await {
eprintln!("server error: {}", e);
}
Ok(())
}

最佳答案

传递给conn的闭包的make_service_fn参数仅存在于闭包主体中,但闭包的返回值(Ok(service))引用了它。闭包must have the type FnMut(&Target) -> impl Future ,这意味着遗憾的是不允许它返回引用其参数的值。

唯一的解决方案是在设置请求处理程序时从conn复制/克隆所需的任何内容,因为一旦闭包返回,您将无法保留对其的引用。

关于rust - 使用hyper关闭的Rust生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62459931/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com