Тип impl Trait
Тип impl Trait используется в позиции возвращаемого типа
функции или метода, а также в позиции параметра. В позиции
возвращаемого типа он означает, что функция возвращает
некоторый конкретный тип, реализующий указанный трейт, но
имя этого типа скрыто от вызывающего кода. В позиции параметра
impl Trait является синтаксическим сахаром для
обобщённого параметра и означает, что функция принимает
любой тип, реализующий указанный трейт.
Синтаксис
// в позиции возвращаемого типа
fn имя_функции() -> impl Трейт
{
// тело функции
}
// в позиции параметра
fn имя_функции(параметр: impl Трейт)
{
// тело функции
}
Пример
Давайте напишем функцию, которая возвращает
impl Iterator, скрывая конкретный тип итератора:
fn make_iter() -> impl Iterator<Item = i32>
{
vec![1, 2, 3, 4, 5].into_iter()
}
fn main()
{
let res: Vec<i32> = make_iter().collect();
println!("{:?}", res);
}
Результат выполнения кода:
[1, 2, 3, 4, 5]
Пример
Давайте используем impl Trait в позиции параметра,
чтобы принять любой тип, реализующий трейт Display:
use std::fmt::Display;
fn print_value(value: impl Display)
{
println!("{}", value);
}
fn main()
{
print_value("abcde");
print_value(12345);
}
Результат выполнения кода:
"abcde"
12345
Пример
Давайте напишем функцию, которая возвращает
impl Fn, скрывая конкретный тип замыкания:
fn make_adder(x: i32) -> impl Fn(i32) -> i32
{
move |y| x + y
}
fn main()
{
let add_five = make_adder(5);
let res = add_five(10);
println!("{}", res);
}
Результат выполнения кода:
15