如何解决如何在火箭中使用结构体的方法作为处理程序
#[derive(Debug,Clone)]
struct Author<T: Persister + Send + Sync + Clone> {
dao: T,}
impl<T: Persister + Send + Sync + Clone> Author<T> {
fn new(dao: T) -> Self {
Author { dao: dao }
}
fn handle_sign_up<'r>(&self,request: &'r Request,data: Data) -> Outcome<'r> {
Outcome::Success(Response::new())
}
}
impl<T> Handler for Author<T>
where
T: Persister + Send + Sync + Clone + 'static,{
fn handle<'r>(&self,data: Data) -> Outcome<'r> {
Outcome::Success(Response::new())
}
}
impl<T: Persister + Send + Sync + Clone + 'static> Into<Vec<Route>> for Author<T> {
fn into(self) -> Vec<Route> {
vec![Route::new(rocket::http::Method::Post,"/",self)]
}
}
fn main() {
let dao = Dao::new("MysqL://user:password@localhost/test".to_owned()).unwrap();
let author = Author::new(dao);
rocket::ignite().mount("/",author).launch();
}
我想使用 Author
(ex. Author::handle_sign_up
) 的方法作为路由的处理程序,但它不起作用。我尝试使用像下面这样的 clouser
impl<T: Persister + Send + Sync + Clone + 'static> Into<Vec<Route>> for Author<T> {
fn into(self) -> Vec<Route> {
let p = |req,data| self.handle_sign_up(req,data);
vec![Route::new(rocket::http::Method::Post,p)]
}
}
不匹配的类型
预期类型 for<'r,'s> Fn<(&'r rocket::Request<'s>,rocket::Data)>
找到类型 Fn<(&rocket::Request<'_>,rocket::Data)>
有什么办法可以实现吗?
解决方法
onUpdate
的问题是编译器会推断参数类型的生命周期,但在这里出错。 |req,data| self.handle_sign_up(req,data)
和 &'r Request
之间的关系是必需的,但不存在。
不幸的是,you cannot explicitly annotate the lifetimes of a closure。
一种解决方法(如上面链接中的一个答案所建议的那样)是使用辅助函数,它不会做任何事情,但会鼓励编译器推断正确的签名:
Outcome<'r>
附带说明:我不是 Rocket 的专家,但我相信如果您像这样为 fn as_handler_func<F>(f: F) -> F
where
F: for<'r> Fn(&'r Request,Data) -> Outcome<'r>,{
f
}
impl<T: Send + Sync + Clone + 'static> Into<Vec<Route>> for Author<T> {
fn into(self) -> Vec<Route> {
let p = as_handler_fn(move |req,data));
vec![Route::new(rocket::http::Method::Post,"/",p)]
}
}
实现 Into<Vec<Route>>
,您可能不想为它Author
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。