Rust 使用hyper的密封件的防锈寿命

Rust 使用hyper的密封件的防锈寿命,rust,lifetime,hyper,Rust,Lifetime,Hyper,将conn传递给request\u处理程序时,您一直在学习锈病并遇到生存期问题。我听到一个错误说 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,

conn
传递给
request\u处理程序
时,您一直在学习锈病并遇到生存期问题。我听到一个错误说

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...

传递给
make\u service\u fn的闭包的
conn
参数仅与闭包体的寿命相同,但是闭包的返回值(
Ok(service)
)引用它。闭包,这意味着不允许返回引用其参数的值


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

您不使用
请求处理程序中的
conn
,如果删除此参数,问题就会消失。你能这样做吗?或者你真正的代码更复杂?我会使用它,即使它现在还没有被使用。这对我很有帮助。我看到了其他被克隆的项目的例子,并没有完全理解它们的用途
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(())
}