创建具有 "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
的生命周期。
当运行服务器和处理每个请求时,hyper需要一个静态运行时。
不,它没有。它有一个绑定为: 'static
,这意味着传递的任何引用都必须是'static
,但你根本不需要传递裸引用。
对于这种模式,最常见的做法是传递像Arc
这样的东西。这允许共享底层资源。
pub fn do_something<F, T>(f: F)
where
F: Fn() -> T + 'static,
T: 'static,
{
f();
f();
f();
}
struct MyStruct;
static OBJ: MyStruct = MyStruct;
fn main() {
do_something(|| &OBJ);
let another = MyStruct;
do_something(|| &another);
use std::sync::Arc;
let shared = Arc::new(MyStruct);
do_something(move || shared.clone());
}
你甚至可以使用内部可变性来进行动态重构。参见:
内部可变性。
另请参见: