Основной способ для создания ссылки со временем жизни 'static
состоит в создании переменной static
.Статическая переменная - это переменная, которая может быть создана в время компиляции :
struct MyStruct;
impl MyStruct {
pub fn do_something(&'static self) {}
}
static OBJ: MyStruct = MyStruct;
fn main() {
OBJ.do_something();
}
По мере того, как улучшается история постоянной оценки Rust, это будет более распространенным явлением, но никогда не разрешит настройку во время выполнения.
Гораздо менее распространенный метод - умышленная утечка памяти, создание ссылки, которая будет длиться "вечно".Это не должно поощряться, потому что утечка памяти не очень хорошая вещь:
fn main() {
let obj = Box::leak(Box::new(MyStruct));
obj.do_something();
}
Существует также возможность создания синглтона:
, как только main
будет завершеноприложение должно завершиться.
Возможно, но компилятор не обрабатывает main
специально для целей жизни.
гипер требует статической среды выполнения при запускесервер и обрабатывает каждый запрос.
Нет, это не так.Он имеет предел : 'static
, что означает, что любые переданные ссылки должны быть 'static
, но вам вообще не нужно передавать пустую ссылку.
Для таких шаблонов наиболееобычная вещь - передать что-то вроде Arc
.Это позволяет совместно использовать базовый ресурс.
pub fn do_something<F, T>(f: F)
where
F: Fn() -> T + 'static,
T: 'static,
{
// "spawn" 3 threads
f();
f();
f();
}
struct MyStruct;
static OBJ: MyStruct = MyStruct;
fn main() {
// OK
do_something(|| &OBJ);
// Not OK
let another = MyStruct;
do_something(|| &another);
// OK
use std::sync::Arc;
let shared = Arc::new(MyStruct);
do_something(move || shared.clone());
}
Вы даже можете использовать внутреннюю изменчивость , если вам нужна динамическая реконфигурация.
См. Также: