如果外部 crate 明确要求静态生命周期怎么办?

What to do if an external crate requires static lifetime explicitly?

我正在使用 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。有没有办法解决这个问题?

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

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