У меня есть функция, которая принимает изменяемую ссылку на итератор. Внутри этой функции я хочу просмотреть итератор, чтобы проверить, остались ли в нем элементы. В этом случае я хочу вернуть ошибку, и итератор не будет продвинут.
МРЭ:
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 функции, чтобы оно не потерялось.

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