Lifetime в функциях
Параметры времени жизни (lifetime) в функциях позволяют явно указать компилятору, как долго должны жить ссылки, передаваемые в функцию. Это необходимо, когда функция возвращает ссылку, и компилятор не может самостоятельно определить, к какому из входных параметров она привязана. Параметром выступает аннотация времени жизни, которая связывает входные ссылки с выходной ссылкой.
Синтаксис
fn имя_функции<'a>(параметр: &'a Тип) -> &'a Тип
{
// тело функции
}
Пример
Давайте напишем функцию, которая возвращает ссылку на более длинную из двух строк. Без указания времени жизни компилятор не сможет определить, к какому параметру привязано возвращаемое значение:
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"
Пример
Давайте рассмотрим случай, когда время жизни ссылок различается. Функция все равно сможет вернуть ссылку, так как аннотация 'a указывает на пересечение времен жизни:
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str
{
if x.len() > y.len() {
x
} else {
y
}
}
fn main()
{
let s1 = String::from("abcde");
let res;
{
let s2 = String::from("12345");
res = longest(&s1, &s2);
}
println!("{}", res);
}
Результат выполнения кода:
"abcde"
Пример
Если функция не возвращает ссылку, указывать время жизни не обязательно, даже если на вход приходят ссылки:
fn print_str(s: &str)
{
println!("{}", s);
}
fn main()
{
let s1 = "abcde";
print_str(s1);
}
Результат выполнения кода:
"abcde"
Смотрите также
-
раздел
lifetime,
который описывает общую концепцию времени жизни в Rust -
раздел
lifetime elision,
который описывает правила неявного вывода времени жизни -
раздел
multiple lifetimes,
который описывает использование нескольких параметров времени жизни -
раздел
struct lifetime,
который описывает указание времени жизни в структурах