微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在火箭中使用结构体的方法作为处理程序

如何解决如何在火箭中使用结构体的方法作为处理程序

#[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 举报,一经查实,本站将立刻删除。