Подобно замыканиям, явное использование времён жизни требует обобщённого параметра. Кроме того, такой синтаксис показывает, что время жизни 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 равно {} и y равно {}", x, y);

}

// Функция, не имеющая аргументов, но имеющая параметр времени жизни `'a`.

fn failed_borrow<'a>() {

let _x = 12;

// ОШИБКА: `_x` не живёт достаточно долго (`_x` does not live long enough)

//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`.

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

1

сокрытие позволяет скрыть аннотации времён жизни, но они всё же присутствуют.

<p id="Смотрите_также_46"><strong><a l:href="#Смотрите_также_46">Смотрите также:</a></strong></p>

Обобщения и замыкания

<p id="Функции_2"><strong><a l:href="#Функции_2">Функции</a></strong></p>

Сигнатуры функции с указанием времени жизни имеют некоторые ограничения:

   • любая ссылка должна иметь аннотированное время жизни

   • любая возвращаемая ссылка должна иметь то же время жизни, что входящая ссылка или static.

Кроме того, обратите внимание, что возврат ссылок из функции, которая не имеет ссылок во входных аргументах, запрещён, если он приведёт к возвращению ссылок на недопустимые данные. В следующем примере показаны некоторые действительные формы функции со временем жизни:

// Одна входная ссылка со временем жизни `'a`, которая

// будет жить как минимум до конца функции.

fn print_one<'a>(x: &'a i32) {

Перейти на страницу:

Похожие книги