2014-01-18 2 views
3

Я пытаюсь написать код, в котором последовательность перечислений перемотана в начало.Как отменить внутреннее положение под #each?

Я думаю, что rewind подходит для этого приложения, но я не уверен, как его реализовать под итератором each, переходящим в блок? В примере с Ruby-Docs next используется для перемещения внутреннего положения по одному за раз. С блоком он будет двигаться автономно.

Для этого не так много хороших примеров онлайн. Моим обходным решением на данный момент является вложение итератора в цикл и использование break под итератором. Когда итератор прерывается, цикл сбрасывает последовательность перечисления.

Есть ли лучший способ - как я уверен, что есть?

ответ

4

Используйте метод Enumerator#rewind из рубинового класса ядра Ruby.

Переопределяет последовательность перечисления в начало. Если закрытый объект отвечает на метод «перемотки», он вызывается.

a = [1,2,3,4] 
enum= a.each 
enum # => #<Enumerator: [1, 2, 3, 4]:each> 
enum.next # => 1 
enum.next # => 2 
enum.rewind # => #<Enumerator: [1, 2, 3, 4]:each> 
enum.next # => 1 
+0

Я должен указать. Как «каждый» будет использоваться для перехода к блоку? В этом примере 'next' используется для перемещения внутреннего положения по одному за раз. С блоком он будет двигаться автономно. –

+0

@ LambinJust прочитал это http://www.ruby-doc.org/core-2.1.0/Enumerator.html#method-i-each. Все будет ясно. '# each' дает' Enumerator' без блока. –

+0

Сначала я был упрям ​​в замешательстве, но на следующий день я подумал: «Аруп был прав, я понял это сейчас!» Благодаря! –