Lifetime в структурах
Параметры времени жизни (lifetime) в структурах позволяют хранить ссылки внутри полей структуры. Если структура содержит хотя бы одно поле-ссылку, ей необходим параметр времени жизни, который указывает, как долго эта ссылка должна быть валидной. Параметром структура принимает имя времени жизни, которое записывается после имени структуры в угловых скобках.
Синтаксис
struct Name<'a>
{
field: &'a Type,
}
Пример
Давайте создадим структуру Book, которая хранит
ссылку на строку с названием:
struct Book<'a>
{
title: &'a str,
}
fn main()
{
let title = String::from("abcde");
let book = Book { title: &title };
println!("{}", book.title);
}
Результат выполнения кода:
"abcde"
Пример
Структура может содержать несколько полей-ссылок с одним временем жизни:
struct Pair<'a>
{
first: &'a str,
second: &'a str,
}
fn main()
{
let a = String::from("abcde");
let b = String::from("12345");
let pair = Pair { first: &a, second: &b };
println!("{} {}", pair.first, pair.second);
}
Результат выполнения кода:
"abcde 12345"
Пример
Если структура содержит несколько ссылок с разным временем жизни, можно указать несколько параметров:
struct Mixed<'a, 'b>
{
first: &'a str,
second: &'b str,
}
fn main()
{
let a = String::from("abcde");
let b = String::from("12345");
let res = Mixed { first: &a, second: &b };
println!("{} {}", res.first, res.second);
}
Результат выполнения кода:
"abcde 12345"
Пример
Времена жизни можно использовать в методах структуры:
struct Book<'a>
{
title: &'a str,
}
impl<'a> Book<'a>
{
fn get_title(&self) -> &'a str
{
self.title
}
}
fn main()
{
let title = String::from("abcde");
let book = Book { title: &title };
println!("{}", book.get_title());
}
Результат выполнения кода:
"abcde"
Смотрите также
-
раздел
lifetime,
который описывает общую концепцию времени жизни -
раздел
fn-lifetime,
который описывает времена жизни в функциях -
раздел
multiple-lifetimes,
который описывает несколько параметров времени жизни -
раздел
lifetime-elision,
который описывает автоматический вывод времени жизни