rust - 将不可变结构传递给多个闭包
问题描述
我有一个结构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 的引用可能就足够了。
我怎样才能在这里实现呢?
解决方案
推荐阅读
- wireshark - 如何使用 mbuf 构造 IP 有效负载数据包?
- c++ - 使用 c_str() 或 toCharArray() 将字符串转换为 const char?
- node.js - 在子目录中托管应用程序时的 ExpressJS API 路由
- java - 使用泛型构造子类的实例
- r - 如何循环读取多个excel数据文件并处理每个文件中的数据?
- python - 运行“pip install python-binance”时如何修复错误?
- mysql - 无法在 EC2 上同时为 Jenkins 和 MySQL 运行 docker 容器
- abaqus - Abaqus:从 Abaqus 高效导出大型 xy 数据集
- reactjs - Typescript:如何正确组合不同的类型?
- algorithm - 图中节点分配的算法