Время жизни
Время жизни (lifetime) - это параметр, который указывает,
как долго ссылка остаётся действительной.
Компилятор Rust использует времена жизни,
чтобы гарантировать безопасность памяти без сборщика мусора.
Времена жизни обозначаются апострофом и именем,
например 'a, 'b или 'static.
Времена жизни не влияют на время выполнения программы. Они нужны только компилятору для анализа заимствований. Чаще всего времена жизни указываются в функциях, которые принимают или возвращают ссылки, а также в структурах, хранящих ссылки.
Синтаксис
&'a T
&'a mut T
fn 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);
}
Результат выполнения кода:
"abcde"
Пример
Давайте рассмотрим структуру, которая хранит ссылку на строковый срез:
struct Holder<'a>
{
text: &'a str,
}
fn main()
{
let s = "abcde";
let holder = Holder { text: s };
println!("{}", holder.text);
}
Результат выполнения кода:
"abcde"
Пример
Давайте рассмотрим статическое время жизни 'static,
которое означает, что ссылка действительна
на протяжении всей программы:
fn get_text() -> &'static str
{
"abcde"
}
fn main()
{
let res = get_text();
println!("{}", res);
}
Результат выполнения кода:
"abcde"
Смотрите также
-
ключевое слово
borrowing,
которое позволяет использовать данные без передачи владения -
ключевое слово
borrow-rules,
которые определяют правила заимствования в Rust -
ключевое слово
static-lifetime,
которое обозначает время жизни на протяжении всей программы -
ключевое слово
lifetime-elision,
которое позволяет опускать времена жизни в простых случаях