РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
479 of 1245 menu

Higher-ranked lifetime for<>

Конструкция for<'a> в Rust называется higher-ranked lifetime и позволяет объявить время жизни, которое действует для любого возможного лайфтайма. Она используется в сигнатурах функций, трейтов и типов, когда нужно сказать, что некоторая ссылка работает при любом времени жизни, а не при конкретном. Параметром конструкция принимает имя времени жизни после ключевого слова for, а затем - тип или трейт, в котором это время жизни используется.

Синтаксис

for<'a> fn(&'a str) -> &'a str for<'a> Fn(&'a str) -> &'a str for<'a> Trait<'a>

Пример

Давайте объявим функцию, которая принимает замыкание, работающее с любым временем жизни, и возвращает результат его вызова:

fn apply<'a, F>(f: F, s: &'a str) -> &'a str where F: for<'b> Fn(&'b str) -> &'b str, { f(s) } fn main() { let res = apply(|x| x, "abcde"); println!("{}", res); }

Результат выполнения кода:

"abcde"

Пример

Давайте рассмотрим, как for<'a> помогает при работе с трейт-объектами, которые принимают ссылки с любым временем жизни:

fn call_with<F>(f: F) where F: for<'a> Fn(&'a str) -> usize, { let s = String::from("12345"); let res = f(&s); println!("{}", res); } fn main() { call_with(|x| x.len()); }

Результат выполнения кода:

5

Пример

Давайте используем for<'a> в определении трейта, чтобы метод трейта мог принимать ссылку с любым временем жизни:

trait Handler { fn handle<'a>(&self, input: &'a str) -> &'a str; } struct Echo; impl Handler for Echo { fn handle<'a>(&self, input: &'a str) -> &'a str { input } } fn run<H>(h: H, s: &str) -> String where H: for<'a> Fn(&'a str) -> &'a str, { h(s).to_string() } fn main() { let res = run(|x| x, "abcde"); println!("{}", res); }

Результат выполнения кода:

"abcde"

Смотрите также

  • ключевое слово lifetime,
    которое задаёт время жизни ссылок в Rust
  • конструкция fn-lifetime,
    которая описывает времена жизни в сигнатурах функций
  • правило lifetime-elision,
    которое позволяет опускать времена жизни в типовых случаях
  • механизм multiple-lifetimes,
    который описывает использование нескольких времён жизни
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить