Несколько времён жизни
В Rust каждый параметр-ссылка может иметь своё собственное время жизни. Когда функция принимает несколько ссылок с разными временами жизни, компилятор должен понимать, как они связаны между собой. Синтаксис нескольких времён жизни позволяет явно указать эти связи, давая компилятору информацию о том, что результат зависит от одного конкретного параметра, а не от всех сразу. Параметрами выступают имена времён жизни, которые объявляются в угловых скобках после имени функции.
Синтаксис
fn func<'a, 'b>(x: &'a str, y: &'b str) -> &'a str
{
// ...
}
Пример
Давайте напишем функцию, которая принимает две строки с разными временами жизни и возвращает первую из них. Это покажет компилятору, что результат живёт ровно столько же, сколько первый аргумент:
fn first<'a, 'b>(x: &'a str, y: &'b str) -> &'a str
{
x
}
fn main()
{
let s1 = String::from("abcde");
let s2 = String::from("12345");
let res = first(&s1, &s2);
println!("{}", res);
}
Результат выполнения кода:
"abcde"
Пример
Если же функция возвращает вторую строку, то и время жизни результата должно быть связано со вторым параметром:
fn second<'a, 'b>(x: &'a str, y: &'b str) -> &'b str
{
y
}
fn main()
{
let s1 = String::from("abcde");
let s2 = String::from("12345");
let res = second(&s1, &s2);
println!("{}", res);
}
Результат выполнения кода:
"12345"
Смотрите также
-
время жизни
lifetime,
которое описывает базовый синтаксис аннотаций -
время жизни
struct-lifetime,
которое применяется для полей структур -
правила
borrow-rules,
которые регулируют заимствование ссылок -
lifetime-elision,
которое позволяет опускать аннотации в простых случаях