rust - 对 Actix 服务器中捕获的变量的引用会导致“参数要求它必须比‘静态’更有效”
问题描述
在下面的示例中,我有参数verbose
并且data_source
由命令行参数设置。verbose
是一个布尔标志,但data_source
用于从一组可用函数中选择一个默认值,这些函数可以根据应用程序的数据源使用。
Actix 使用闭包来设置服务器,因此我需要将这些参数放入闭包中。我添加move
了布尔值,但在传递要用于索引的函数时遇到问题,并且遇到了生命周期错误。我试过把这个功能装箱,但这似乎没有帮助。
如果我正确理解了错误消息,实际上是闭包本身无法存活'static
。
我应该怎么做才能解决这个问题?
extern crate actix;
extern crate actix_web;
extern crate env_logger;
use actix_web::http::Method;
use actix_web::{middleware, server, App, HttpRequest, HttpResponse};
enum DataSource {
Postgres,
HDF5,
}
fn index_postgres(req: &HttpRequest) -> HttpResponse {
HttpResponse::Ok().body("not implemented")
}
fn index_hdf5(req: &HttpRequest) -> HttpResponse {
HttpResponse::Ok().body("not implemented")
}
fn main() {
let mut verbose = false;
verbose = true;
let mut data_source = DataSource::Postgres;
data_source = DataSource::HDF5;
let index = match data_source {
DataSource::Postgres => index_postgres,
DataSource::HDF5 => index_hdf5,
};
::std::env::set_var("RUST_LOG", "actix_web=info");
env_logger::init();
let sys = actix::System::new("test");
server::new(move || {
if verbose {
App::new()
.middleware(middleware::Logger::default())
.resource("/", |r| r.method(Method::GET).f(index))
} else {
App::new().resource("/", |r| r.method(Method::GET).f(index))
}
})
.bind("127.0.0.1:8080")
.unwrap()
.start();
println!("Started http server: 127.0.0.1:8080");
let _ = sys.run();
}
error: unsatisfied lifetime constraints
--> src\main.rs:50:13
|
48 | server::new(move || {
| ------- lifetime `'1` represents this closure's body
49 | if verbose {
50 | / App::new()
51 | | .middleware(middleware::Logger::default())
52 | | .resource("/", |r| r.method(Method::GET).f(index))
| |__________________________________________________________________^ argument requires that `'1` must outlive `'static`
|
= note: closure implements `Fn`, so references to captured variables can't escape the closure
解决方案
我不明白编译器想说什么,但很明显你需要move
处理程序闭包:
if verbose {
App::new()
.middleware(middleware::Logger::default())
.resource("/", move |r| r.method(Method::GET).f(index))
} else {
App::new().resource("/", move |r| r.method(Method::GET).f(index))
}
这是因为您需要index
从外部封闭移动。
推荐阅读
- websocket - AttributeError:“应用程序”对象没有属性“webSocketsPool”
- sql - 如何插入 CLOB 数据?
- r - 如何在 R 中操作我已经拥有频率的数据
- android - 每次点击“设置”按钮时应用程序崩溃,我该如何调试?
- python - Python变量范围为已定义变量提供未定义
- python - 在 anaconda spyder 中导入 pandas 和 matplotlib 的问题
- java - 为两个实体创建 JWT 安全性
- swift - NSTableView 初始化宽度问题
- html - 如何在我的部分中使用 css/html 为部分着色
- javascript - 卡住加载反应故事书