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,
который описывает использование нескольких времён жизни