gpt4 book ai didi

rust - 引用 Actix 服务器中捕获的变量会导致 "argument requires that it must outlive ' 静态”

转载 作者:行者123 更新时间:2023-11-29 08:18:02 25 4
gpt4 key购买 nike

在下面的示例中,我有通过命令行参数设置的参数 verbosedata_sourceverbose 是一个 bool 标志,但 data_source 用于从一组可用函数中选择一个默认值,这些函数可以根据应用程序的数据源使用。

Actix 使用闭包来设置服务器,因此我需要将这些参数放入闭包中。我为 bool 添加了 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

关于rust - 引用 Actix 服务器中捕获的变量会导致 "argument requires that it must outlive ' 静态”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54618158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com