Rust имеет одну специальную встроенную аннотацию, которая называется 'static и которая означает, что ссылка будет существовать в течение всей программы.
Например, ранее была рассмотрена следующая программа:
fn main(){
let message = get_message();
println!("message: {}", message);
}
fn get_message<'a>() -> &'a str {
"hello"
}
Фактически здесь мы имеем дело со статическим временем жизни ссылки, которое равно времени выполнения программы. Почему? Строковые литералы сохраняются в бинарном виде и доступны в течение всего времени выполнения программы. Поэтому время жизни описывается как статическое. То есть ссылка живет в течение всей работы программы. И мы могли бы здесь применить аннотацию 'static:
fn main(){
let message = get_message();
println!("message: {}", message);
}
fn get_message() -> &'static str {
"hello"
}
Причем не важно, в какой области видимости создается ссылка, она будет доступна в течение все работы программы. Например:
fn main(){
let message;
{
let words = get_message();
message = words;
}
// ссылка, возвращенная get_message, продолжает существовать
println!("message: {}", message);
}
fn get_message() -> &'static str {
"hello"
}
Здесь ссылка возвращается во вложенном блоке кода, который по идее создается свою область видимости, однако по-прежнему проблем с компиляцией и выполнением программы не возникнет. Поскольку возвращается строковый слайс в виде строкового литерала со статическим временем жизни.