< 返回版块

chenmogg 发表于 2021-06-16 11:08

Tags:trait,范型,tide

相关代码,部分已省略

  • main.rs
#[derive(Clone)]
pub struct State {
    db_pool: sqlx::PgPool,
}

let state = State{……} //省略连接池

let mut app = tide::with_state(state);
    app.add_route(); // add_route为自己定义的方法
    app.listen(config::api_address()).await?;
  • route.rs
pub trait Route
{
    fn add_route(&mut self) -> &mut Self;
}

impl<T> Route for tide::Server<T>
    where
        T: Clone + Send + Sync + 'static,
// impl Route for tide::Server<State>  换成此行,一切正常
{
    fn add_route(&mut self) -> &mut Self {
        use controller::*;

        self.at("/auth").get(auth);
  • auth.rs
pub async fn auth(req: tide::Request<State>) -> tide::Result
{
    let db_pool = req.state().db_pool.clone();
    ......
}
  • 报错
error[E0631]: type mismatch in function arguments
  --> xxx/src/route.rs:17:30
   |
17 |         self.at("/auth").get(auth::auth);
   |                              ^^^^^^^^^^ expected signature of `fn(tide::Request<T>) -> _`
   | 
  ::: http-api/src/controller/auth.rs:6:1
   |
6  | pub async fn auth(req: tide::Request<State>) -> tide::Result
   | ------------------------------------------------------------ found signature of `fn(tide::Request<State>) -> _`
   |
   = note: required because of the requirements on the impl of `Endpoint<T>` for `fn(tide::Request<State>) -> impl Future {controller::auth::auth}`

各位前辈,请问为啥route.rs里不用范型就能正常,使用范型后,明明这里的auth里的State满足T所需的Trait,但还是报错?

评论区

写评论
作者 chenmogg 2021-06-16 19:33

糊涂了,这个问题我居然看了一天,懵兮兮的。感谢前辈。

--
👇
dakai-chen: T最终会变成一个具体的类型,并且是由使用者指定。使用者指定的T类型不一定会是State类型。

dakai-chen 2021-06-16 15:41

T最终会变成一个具体的类型,并且是由使用者指定。使用者指定的T类型不一定会是State类型。

1 共 2 条评论, 1 页