Трейт IntoIterator
Трейт IntoIterator описывает преобразование
значения в итератор. Если тип реализует этот трейт,
то его значения можно перебирать в цикле for,
передавать в методы, принимающие итераторы, и использовать
в цепочках адаптеров. Трейт содержит связанный тип
Item (тип элементов итератора), связанный тип
IntoIter (тип самого итератора) и метод
into_iter, который и выполняет преобразование.
Метод не принимает параметров и возвращает значение типа
IntoIter.
Синтаксис
trait IntoIterator
{
type Item;
type IntoIter: Iterator<Item = Self::Item>;
fn into_iter(self) -> Self::IntoIter;
}
Трейт реализован для многих стандартных типов: для векторов, массивов, срезов, строк, диапазонов, хеш-таблиц и других коллекций. При этом реализация может быть выполнена как для самого типа, так и для ссылки на него.
Пример
Давайте преобразуем вектор в итератор и переберём
его элементы с помощью цикла for:
fn main()
{
let vec = vec![1, 2, 3, 4, 5];
for item in vec
{
println!("{}", item);
}
}
Результат выполнения кода:
1
2
3
4
5
Пример
Давайте вызовем метод into_iter явно
и соберём элементы вектора в новый вектор
с помощью метода collect:
fn main()
{
let vec = vec!["a", "b", "c", "d", "e"];
let res: Vec<&str> = vec.into_iter().collect();
println!("{:?}", res);
}
Результат выполнения кода:
["a", "b", "c", "d", "e"]
Пример
Давайте реализуем трейт IntoIterator
для собственной структуры, чтобы её можно было
перебирать в цикле:
struct Counter
{
count: u32,
}
impl IntoIterator for Counter
{
type Item = u32;
type IntoIter = std::ops::Range<u32>;
fn into_iter(self) -> Self::IntoIter
{
0..self.count
}
}
fn main()
{
let counter = Counter { count: 5 };
for item in counter
{
println!("{}", item);
}
}
Результат выполнения кода:
0
1
2
3
4
Смотрите также
-
трейт
Trait,
который описывает общее поведение типов -
трейт
FromIterator,
который собирает коллекцию из итератора -
трейт
impl Trait,
который позволяет возвращать итераторы из функций -
трейт
Trait Bound,
который задаёт ограничения на обобщённые типы