Явная аннотация
Проверяющая система ссылок использует явные аннотации времени жизни для определения того, насколько долго ссылки должны быть валидными. В случаях, когда времени жизни не могут быть опущены, Rust требует явных аннотаций для определения времени жизни ссылки. Синтаксис для явной аннотации времени жизни использует знак апострофа следующим образом:
foo<'a>
// `foo` имеет параметр времени жизни `'a`
Похожий на замыкания, использование времени жизни требует обобщений. Кроме того, этот синтаксис времени жизни указывает, что время жизни foo
не может превышать время жизни 'a
. Явная аннотация типа имеет форму &'a T
, где 'a
уже был определен.
В случаях с несколькими временем жизни синтаксис аналогичен:
foo<'a, 'b>
// `foo` имеет параметры времени жизни `'a` и `'b`
В этом случае время жизни foo
не может превышать время жизни 'a
или 'b
.
Посмотрите на следующий пример для явной аннотации времени жизни в действии:
// `print_refs` принимает две ссылки на `i32`, которые имеют разные
// времена жизни `'a` и `'b`. Эти два времени жизни должны быть как минимум
// столькими же, как и функция `print_refs`.
fn print_refs<'a, 'b>(x: &'a i32, y: &'b i32) {
println!("x is {} and y is {}", x, y);
}
// Функция, которая не принимает аргументов, но имеет параметр времени жизни `'a`.
fn failed_borrow<'a>() {
let _x = 12;
// ОШИБКА: `_x` не имеет достаточно длительного времени жизни
let y: &'a i32 = &_x;
// Попытка использовать время жизни `'a` в качестве явной аннотации типа
// внутри функции завершится ошибкой, потому что время жизни `&_x` короче,
// чем время жизни `y`. Короткое время жизни не может быть приведено к более длительному.
}
fn main() {
// Создайте переменные, которые будут заимствованы ниже.
let (four, nine) = (4, 9);
// Займы (`&`) обеих переменных передаются в функцию.
print_refs(&four, &nine);
// Любой заимствованный ввод должен иметь более длительный срок жизни, чем заимствователь.
// Другими словами, время жизни `four` и `nine` должно быть
// длиннее, чем время жизни `print_refs`.
failed_borrow();
// `failed_borrow` не содержит ссылок, которые могли бы заставить `'a` быть
// длиннее времени жизни функции, но `'a` длиннее.
// Поскольку время жизни никогда не ограничивается, оно по умолчанию равно `'static`.
}