Как получить текущий элемент из итератора

Можно ли получить текущий элемент из итератора в Rust?

Мне бы хотелось иметь ту же функциональность, что и .next(), но она не будет переходить к следующему элементу, а просто вернет текущий элемент.

Так:

fn main() {
    let x = vec![1, 2, 3, 4, 5];

    let iterator = x.iter(); // Create an iterator

    // y is now just a single i32 from the x array
    let y = iterator.next().unwrap();

    // I'm looking for method that will return the current item from the iterator
    // Something like iterator.current() which is not implemented for some reason.
    let z = iterator.current();
}
Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
1
0
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете обернуть свой итератор в Peekable:

fn main() {
    let x = vec![1, 2, 3, 4, 5];

    let iterator = x.iter().peekable();

    let y = iterator.next().unwrap();

    let z = iterator.peek();
}

Peek() возвращает предмет, который должен быть выдан, т. е. предмет, который будет возвращен в следующий раз, когда вы позвоните next(). Обратите внимание, что он возвращает ссылку, а не принадлежащий элемент.

Хм логично, спасибо! Есть ли причина, по которой нет такого метода, как iterator.current()?

Kuly14 20.11.2022 16:11

@ Kuly14 Kuly14 Не все итераторы могут предоставить его бесплатно. Например. они могут выполнять дорогостоящие вычисления для следующего элемента. Поэтому Rust предпочитает предоставлять тип, который сам может отслеживать это состояние. Я не думаю, что есть веская причина, почему, например. итераторы слайсов этого не делают, за исключением того, что «это обычно не требуется».

Chayim Friedman 20.11.2022 16:13

@ Kuly14 Моя ошибка: итераторы срезов делают. Они предоставляют методы as_slice(), которые возвращают все следующие элементы.

Chayim Friedman 20.11.2022 16:14

@ Kuly14, потому что для этого потребуется, чтобы каждый итератор сохранял элемент, что создает две сложности: дополнительное пространство для хранения чего-то, что обычно бесполезно, и либо конфликт с владением (если итератору необходимо сохранить последний полученный элемент), либо триггерная сторона- эффекты заранее (если они есть у итератора). peek делает шаг явным, поэтому потребитель итераторов точно знает, что он делает, и (надеюсь) не смешивает побочные эффекты и доступные для просмотра итераторы.

Masklinn 20.11.2022 20:09

Кроме того... его можно предоставить с помощью оболочки/адаптера, так зачем делать его частью базового контракта? То же самое с завершением: итератор должен остановиться, как только он будет возвращен None один раз, но это не гарантируется. Вместо этого можно использовать адаптер плавкого предохранителя для защелки, если это необходимо. Плюс технически может быть странное использование возобновляемых итераторов.

Masklinn 20.11.2022 20:09

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