Время жизни lifetime
Время жизни (lifetime) - это ключевое понятие в системе владения Rust (ownership). Оно нужно для того, чтобы компилятор мог проверить, что все ссылки в программе указывают на действительные данные и не становятся висячими. В большинстве случаев компилятор выводит время жизни автоматически, но иногда его нужно указывать явно с помощью апострофа 'a. Параметром времени жизни является идентификатор (обычно 'a, 'b и т.д.), который связывает ссылки и определяет, сколько они живут.
Синтаксис
fn function_name<'a>(x: &'a T) -> &'a T
Пример
Давайте рассмотрим простой пример, где время жизни указывается явно для функции, возвращающей ссылку на более длинную строку:
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str
{
if x.len() > y.len() { x } else { y }
}
fn main()
{
let s1 = "abcde";
let s2 = "12345";
let res = longest(s1, s2);
println!("{}", res);
}
Результат выполнения кода:
"12345"
Пример
Давайте посмотрим, как время жизни работает внутри структуры. Структура Holder хранит ссылку на строку и должна быть параметризована временем жизни:
struct Holder<'a>
{
value: &'a str,
}
fn main()
{
let s = "abcde";
let holder = Holder { value: s };
println!("{}", holder.value);
}
Результат выполнения кода:
"abcde"
Пример
Давайте рассмотрим пример, где время жизни связывает несколько ссылок и позволяет вернуть ссылку с более коротким временем жизни:
fn first<'a>(x: &'a str, y: &str) -> &'a str
{
x
}
fn main()
{
let s1 = "abcde";
let res;
{
let s2 = "12345";
res = first(s1, s2);
}
println!("{}", res);
}
Результат выполнения кода:
"abcde"
Смотрите также
-
раздел
ownership,
который описывает систему владения в Rust -
раздел
borrowing,
который объясняет, как заимствовать значения без передачи владения -
раздел
static lifetime,
который описывает время жизни'static -
раздел
lifetime elision,
который объясняет автоматический вывод времени жизни