Возврат impl Trait
Возврат impl Trait - это синтаксическая конструкция,
позволяющая функции указать в сигнатуре, что она возвращает
значение некоторого типа, который реализует заданный трейт,
без указания самого конкретного типа. Это удобно, когда
точный тип возвращаемого значения неизвестен вызывающему коду
или слишком сложен для записи. Параметром конструкция принимает
один или несколько трейтов, которым должен удовлетворять
возвращаемый тип.
Синтаксис
fn имя_функции(параметры) -> impl Трейт
{
// тело функции
}
Пример
Давайте напишем функцию get_number, которая возвращает
значение, реализующее трейт Iterator, скрывая конкретный тип:
fn get_numbers() -> impl Iterator<Item = i32>
{
vec![1, 2, 3, 4, 5].into_iter()
}
fn main()
{
for n in get_numbers()
{
println!("{}", n);
}
}
Результат выполнения кода:
1
2
3
4
5
Пример
Давайте напишем функцию make_greeting, которая возвращает
значение, реализующее трейт Display, скрывая конкретный тип:
use std::fmt::Display;
fn make_greeting() -> impl Display
{
"abcde"
}
fn main()
{
let res = make_greeting();
println!("{}", res);
}
Результат выполнения кода:
"abcde"
Пример
Давайте напишем функцию positive_numbers, которая принимает
срез и возвращает итератор, реализующий трейт Iterator:
fn positive_numbers(numbers: &[i32]) -> impl Iterator<Item = i32> + '_
{
numbers.iter().copied().filter(|&n| n > 0)
}
fn main()
{
let data = vec![-2, -1, 0, 1, 2, 3];
let res: Vec<i32> = positive_numbers(&data).collect();
println!("{:?}", res);
}
Результат выполнения кода:
[1, 2, 3]
Смотрите также
-
ключевое слово
impl Trait,
которое используется для указания абстрактного типа в аргументах и возвращаемом значении -
ключевое слово
dyn Trait,
которое позволяет работать с трейтами через динамическую диспетчеризацию -
конструкция
trait bound,
которая ограничивает обобщённые типы определёнными трейтами -
конструкция
where,
которая задаёт ограничения на обобщённые типы в отдельном блоке