首页 > 解决方案 > 将不可变结构传递给多个闭包

问题描述

我有一个结构Router,一旦建成,就永远不会改变。我想通过引用几个闭包来传递它:

#![feature(trait_alias)]
use futures::future::{self,Future};
use hyper::{Body, Request,Method,Response};
use hyper::service::{service_fn,make_service_fn};
use hyper::server::conn::AddrStream;

//

#[cfg_attr(rustfmt, rustfmt_skip)]
pub trait RetFut = Future<Item = Response<Body>, Error = hyper::Error>;

#[derive(Debug, Clone)]
pub struct Route {
    pub method: Method,
}

#[derive(Debug, Clone)]
pub struct Router {
    routes: Vec<Route>,
}
impl Router {
    pub fn builder() -> RouterBuilder {
        RouterBuilder::new()
    }

    pub fn handle_req(&self, req: Request<Body>) -> impl RetFut {
        match (req.method(), req.uri().path()) {
            _ => future::ok(Response::new(Body::from("Hello world"))),
        }
    }
}

#[derive(Debug, Default)]
pub struct RouterBuilder {
    routes: Vec<Route>,
}
impl RouterBuilder {
    pub fn new() -> Self {
        RouterBuilder { routes: vec![] }
    }

    pub fn build(self) -> Router {
        Router {
            routes: self.routes,
        }
    }
}



fn main() {
    let addr = "0.0.0.0:8080".parse().unwrap();

    let router: Router = Router::builder().build();

    let make_svc = make_service_fn(move |_socket: &AddrStream| {
        let router_clone = router.clone();
        service_fn(move |req: Request<Body>| {
            router_clone.clone().handle_req(req)
        })
    });

    let server = hyper::Server::bind(&addr)
        .serve(make_svc)
        .map_err(|e| eprintln!("server error: {}", e));

    hyper::rt::run(server);
}

在这里,我为每个要拥有的闭包传递了路由器的克隆,但这似乎没有必要。

相反,在整个闭包期间对 Router 的引用可能就足够了。

我怎样才能在这里实现呢?

标签: rustclosuresimmutability

解决方案


推荐阅读