Ruby: возвратный перечислитель

Есть ли способ зациклить перечислитель в Ruby? Учитывая этот фрагмент кода:

a=[1,2,3]
a.to_enum

a.next => 1
a.next => 2
a.next => 3
a.next => 1

Как я могу заставить метод next вернуться к первому элементу, когда перечислитель достиг последнего элемента?


person Kit Ho    schedule 21.10.2013    source источник


Ответы (2)


Вы можете использовать Enumerable#cycle:

a = [1, 2, 3]
enum = a.cycle  #=> #<Enumerator: [1, 2, 3]:cycle>

enum.next       #=> 1
enum.next       #=> 2
enum.next       #=> 3
enum.next       #=> 1
person Stefan    schedule 21.10.2013
comment
Привет, спасибо, спаси мой день, но как я могу получить текущее значение, на которое указывает указатель? - person Kit Ho; 21.10.2013
comment
@KitHo используйте Enumerator#peek, например enum = a.cycle; enum.peek - person Patrick Oscity; 21.10.2013
comment
В документах сказано: возвращает следующий объект в перечислителе, но не перемещает внутреннюю позицию вперед. Если позиция уже в конце, поднимается StopIteration. Иногда я просто хочу проверить, на какое текущее значение указывает внутренний указатель. - person Kit Ho; 21.10.2013
comment
Обычно вы просто сохраняете его в переменной. Используя peek, вы можете добиться того же, просто вызвав next после использования вывода, а не до этого. - person Patrick Oscity; 21.10.2013

вы также можете использовать rewind Enumerator.html#rewind

a.rewind

Точно такой же вопрос я задал некоторое время назад как-указать-на-первый-элемент-когда-объект-следующий-достиг-конца

person Bala    schedule 21.10.2013