Адаптер Peekable
Адаптер Peekable оборачивает исходный итератор
и даёт возможность посмотреть на следующий элемент
без его извлечения. Он создаётся методом peekable,
который принимает итератор и возвращает структуру
Peekable. У этой структуры есть метод peek,
возвращающий ссылку на следующий элемент в виде
Option, и метод next, который извлекает
следующий элемент, как у обычного итератора.
Синтаксис
iter.peekable()
peekable.peek()
peekable.next()
Пример
Давайте создадим итератор из вектора и заглянем
в его первый элемент с помощью peek:
fn main()
{
let mut iter = vec![1, 2, 3, 4, 5].into_iter().peekable();
let res = iter.peek();
println!("{:?}", res);
}
Результат выполнения кода:
Some(1)
Пример
Давайте убедимся, что после peek элемент
не извлекается, и вызовем next:
fn main()
{
let mut iter = vec![1, 2, 3, 4, 5].into_iter().peekable();
let peeked = iter.peek();
let taken = iter.next();
println!("{:?}", peeked);
println!("{:?}", taken);
}
Результат выполнения кода:
Some(1)
Some(1)
Пример
Давайте заглянем в следующий элемент после того, как первый уже был извлечён:
fn main()
{
let mut iter = vec![1, 2, 3, 4, 5].into_iter().peekable();
iter.next();
let res = iter.peek();
println!("{:?}", res);
}
Результат выполнения кода:
Some(2)
Пример
Давайте вызовем peek у пустого итератора:
fn main()
{
let mut iter = Vec::<i32>::new().into_iter().peekable();
let res = iter.peek();
println!("{:?}", res);
}
Результат выполнения кода:
None
Пример
Давайте используем peek в цикле, чтобы
обрабатывать элементы, пока следующий не станет
больше трёх:
fn main()
{
let mut iter = vec![1, 2, 3, 4, 5].into_iter().peekable();
while let Some(&val) = iter.peek()
{
if val > 3
{
break;
}
println!("{}", val);
iter.next();
}
}
Результат выполнения кода:
1
2
3