Можно ли заглянуть в изменяемую ссылку итератора?

У меня есть функция, которая принимает изменяемую ссылку на итератор. Внутри этой функции я хочу просмотреть итератор, чтобы проверить, остались ли в нем элементы. В этом случае я хочу вернуть ошибку, и итератор не будет продвинут.

МРЭ:

fn process<I>(iter: &mut I) -> bool
where
    I: Iterator<Item = char>,
{
    iter.peekable().peek().is_some()
}

fn main() {
    let mut iter = "Hello, world!".chars().into_iter();
    process(&mut iter);
    assert_eq!(iter.next(), Some('H'));
}

Однако это не работает, как я наивно ожидал. Ссылка

Можно ли заглянуть в итератор, если у меня есть только изменяемая ссылка на него?

Поскольку я не хочу менять сигнатуру функции из соображений совместимости, в настоящее время я работаю над этой проблемой, возвращая значение iter.next(), если оно есть Some() в варианте перечисления ошибок внутри Result функции, чтобы оно не потерялось.

Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
0
0
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это невозможно, поскольку черта Iterator не дает возможности сделать это. Он предоставляет только метод next(), и этот метод продвигает итератор.

Вы можете улучшить свое текущее решение, не возвращая пользовательское перечисление, а возвращая Peekable напрямую, чтобы вы могли использовать его как итератор.

peek() действительно продвигает итератор. Peekable работает, сохраняя значение, возвращаемое next(), в поле структуры peekable. Итак, при первом вызове peek() вы переместите итератор. Поскольку вы не возвращаете значение Peekable, спрятанное значение теряется, и итератор продвинулся на один шаг.

Другие вопросы по теме