如果外部 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
,这将需要显式创建内存泄漏)。
解决此问题的唯一方法是您传递 Database
或 Arc<Database>
或允许访问的其他内容,以便该函数具有对 Database
的强引用并且可以保证只要函数存在,数据库就会继续存在。
我正在使用 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
,这将需要显式创建内存泄漏)。
解决此问题的唯一方法是您传递 Database
或 Arc<Database>
或允许访问的其他内容,以便该函数具有对 Database
的强引用并且可以保证只要函数存在,数据库就会继续存在。