无法在路由器声明中通过闭包传递 Iron 处理程序
Trouble to pass Iron handlers with closure in the router declaration
我正在尝试用闭包声明我的路线:
use mongodb::Client;
pub fn get_user_routes(client: Client) -> Router {
let controller = controller::UserController::new(client);
let handler = handlers::UserHandler::new(controller);
router!(
index: get "/" => move |r: &mut Request| handler.index(r),
show: get "/:id" => move |r: &mut Request| handler.show(r),
)
}
我得到这个错误,我无法为我的 UserController
实现 Copy
特性,因为 mongodb::Client
没有实现它(它是一个 Arc
) .
error[E0382]: capture of moved value: `handler`
--> src/api/users/mod.rs:17:57
|
16 | index: get "/" => move |r: &mut Request| handler.index(r),
| ---------------------- value moved (into closure) here
17 | show: get "/:id" => move |r: &mut Request| handler.show(r),
| ^^^^^^^ value captured here after move
|
= note: move occurs because `handler` has type `api::users::handlers::UserHandler`, which does not implement the `Copy` trait
我的UserHandler
只有一个UserController
和一个UserController
,一个mongodb::Client
。
您可以 #[derive(Clone)]
为您的处理程序克隆它:
let handler_show = handler.clone();
router!(
index: get "/" => move |r: &mut Request| handler.index(r),
show: get "/:id" => move |r: &mut Request| handler_show.show(r),
)
路由器 get
方法通过 value 获取处理程序。在 Rust 中,按值传递意味着放弃所有权。
根据定义,您不能两次放弃某物的所有权:在您第一次放弃之后,它就不再属于您了!该规则的唯一例外是 Copy
类型,但这些类型仅限于整数和非变异引用(并且引用不可用,因为 Handler: 'static
)。
因此,您需要 在要传递的处理程序上调用 .clone()
。每一次。
一个非常简单的方法是使用块表达式:
let h = handler;
router!(
index: get "/" => { let h = h.clone(); move |r: &mut Request| h.index(r) },
show: get "/:id" => { let h = h.clone(); move |r: &mut Request| h.show(r) },
)
这样,您就不必事先声明所有克隆。
我正在尝试用闭包声明我的路线:
use mongodb::Client;
pub fn get_user_routes(client: Client) -> Router {
let controller = controller::UserController::new(client);
let handler = handlers::UserHandler::new(controller);
router!(
index: get "/" => move |r: &mut Request| handler.index(r),
show: get "/:id" => move |r: &mut Request| handler.show(r),
)
}
我得到这个错误,我无法为我的 UserController
实现 Copy
特性,因为 mongodb::Client
没有实现它(它是一个 Arc
) .
error[E0382]: capture of moved value: `handler`
--> src/api/users/mod.rs:17:57
|
16 | index: get "/" => move |r: &mut Request| handler.index(r),
| ---------------------- value moved (into closure) here
17 | show: get "/:id" => move |r: &mut Request| handler.show(r),
| ^^^^^^^ value captured here after move
|
= note: move occurs because `handler` has type `api::users::handlers::UserHandler`, which does not implement the `Copy` trait
我的UserHandler
只有一个UserController
和一个UserController
,一个mongodb::Client
。
您可以 #[derive(Clone)]
为您的处理程序克隆它:
let handler_show = handler.clone();
router!(
index: get "/" => move |r: &mut Request| handler.index(r),
show: get "/:id" => move |r: &mut Request| handler_show.show(r),
)
路由器 get
方法通过 value 获取处理程序。在 Rust 中,按值传递意味着放弃所有权。
根据定义,您不能两次放弃某物的所有权:在您第一次放弃之后,它就不再属于您了!该规则的唯一例外是 Copy
类型,但这些类型仅限于整数和非变异引用(并且引用不可用,因为 Handler: 'static
)。
因此,您需要 在要传递的处理程序上调用 .clone()
。每一次。
一个非常简单的方法是使用块表达式:
let h = handler;
router!(
index: get "/" => { let h = h.clone(); move |r: &mut Request| h.index(r) },
show: get "/:id" => { let h = h.clone(); move |r: &mut Request| h.show(r) },
)
这样,您就不必事先声明所有克隆。