Метод cycle
Метод cycle относится к трейту Iterator и создаёт
новый итератор, который бесконечно повторяет элементы исходного
итератора. После того как исходный итератор исчерпан, он начинает
перебирать элементы заново с самого начала. Метод не принимает
параметров и возвращает значение типа Cycle, которое
реализует трейт Iterator.
Важно учитывать, что метод cycle требует, чтобы элементы
исходного итератора реализовывали трейт Clone. Это
связано с тем, что при повторном проходе элементы клонируются,
чтобы их можно было выдавать снова.
Синтаксис
iterator.cycle()
Пример
Давайте создадим итератор из вектора vec![1, 2, 3]
и применим к нему метод cycle. Затем возьмём первые
семь элементов с помощью метода take и соберём их
в вектор:
fn main()
{
let res: Vec<i32> = vec![1, 2, 3].into_iter().cycle().take(7).collect();
println!("{:?}", res);
}
Результат выполнения кода:
[1, 2, 3, 1, 2, 3, 1]
Пример
Давайте применим метод cycle к итератору строкового
вектора vec!["a", "b", "c"] и возьмём первые
пять элементов:
fn main()
{
let res: Vec<&str> = vec!["a", "b", "c"].into_iter().cycle().take(5).collect();
println!("{:?}", res);
}
Результат выполнения кода:
["a", "b", "c", "a", "b"]
Пример
Давайте используем метод cycle вместе с методом
enumerate, чтобы пронумеровать повторяющиеся элементы
и вывести первые шесть пар индекс-значение:
fn main()
{
let iter = vec![10, 20].into_iter().cycle().enumerate().take(6);
for (i, val) in iter
{
println!("{}: {}", i, val);
}
}
Результат выполнения кода:
0: 10
1: 20
2: 10
3: 20
4: 10
5: 20