0

我正在使用seanmonstar/warp来构建我的休息服务并面临与生命周期相关的问题。这是我的应用程序启动代码的样子:

struct MyModelStruct {
    //...
}

struct Database {
    //...
}

impl Database {
    fn connect(/* ommited */) -> Database {
        //...
    }
}

fn start_app(db: &Database) -> () {
    let route = warp::post()
        .and(warp::path!("action" / u32))
        .and(warp::body::json::<MyModelSctruct>())
        .map(|_, _| {
             //use db
        })
    warp::serve(route).run(/* address */);
}

我得到了错误:

error[E0621]: explicit lifetime required in the type of `db`
  --> src/application.rs:69:5
   |
46 | fn start_app(db: &Database) -> (){
   |                         -------- help: add explicit lifetime `'static` to the type of `db`: `&'static db::Database`
...
69 |     warp::serve(route);
   |     ^^^^^^^^^^^ lifetime `'static` required

这是因为warp::serve函数定义为

/// Create a `Server` with the provided `Filter`.
pub fn serve<F>(filter: F) -> Server<F>
where
    F: Filter + Clone + Send + Sync + 'static,
    F::Extract: Reply,
    F::Error: IsReject,
{
    Server {
        pipeline: false,
        filter,
    }
}

所以'static生命周期是明确要求的。问题是它被用作

let db = Database::connect(...);
start_app(&db);

所以 db 的生命周期不是static. 有没有办法解决这个问题?

4

1 回答 1

3

'static生命周期意味着函数保证不会引用任何可以在函数本身被删除之前被删除的数据。因为您当前正在传递 a &Database,所以您的函数不能'static(除非您以某种方式传递 a &'static Database,这需要显式创建内存泄漏)。

解决此问题的唯一方法是让您传递Database或传递Arc<Database>一些允许访问的东西,以便该函数对 具有强引用,Database并且可以保证只要该函数存在,数据库就会继续存在。

于 2020-07-26T23:49:54.807 回答