Функции, которые вы передаете замыканию в - hyper::server::Builder::serve
и hyper::rt::run()
- требуют, чтобы их аргументы были 'static
, а не были ограничены какой-либо функцией.main
не считается особенным в этом отношении.
Значение, ограничивающее его, cfg_response
, захватывается внешним замыканием, поэтому для получения ошибки нет необходимости во вложенном замыкании.Вот очень маленькая программа, которая имеет ту же проблему:
fn main() {
let cfg0 = String::from("hello world");
let cfg_response: &str = &cfg0;
let handle = move || {
// this closure takes ownership of cfg_response, a reference to cfg0. Since cfg0 will not
// outlive the function, neither can handle. If it instead took ownership of cfg0 or a
// clone of it, it would have no outside references and could live forever.
return cfg_response.to_owned();
};
serve(handle);
}
fn serve<F: Fn() -> String + 'static>(handle: F) {
loop {
println!("{}", handle());
}
}
Как указывал @Stargateur, это можно решить, сделав владельцем cfg_response
.
В качестве альтернативы, вы можете инициализировать cfg0
в lazy_static, например, так:
#[macro_use]
extern crate lazy_static;
lazy_static! {
static ref cfg0: String = String::from("hello world");
}
Таким образом, вы все равно можете использовать заемное значение, потому что оно соответствует требованиям срока службы.