2017-01-15 5 views
0

У меня есть набор объектов, которые необходимо повторить неопределенное количество раз. Это было бы достаточно легко установить, если массив фиксировались:Перечислитель, состоящий из повторяющегося (но изменяющегося) массива

>> enum = ['Start', 'Peak', 'Finish'].cycle 
>> enum.first(7) 
=> ['Start', 'Peak', 'Finish', 'Start', 'Peak', 'Finish', 'Start'] 

Но результат я хочу это:

>> enum = <Enumerator magic here> 
>> enum.first(7) 
=> ['Start Lap 1', 'Peak Lap 1', 'Finish Lap 1', 'Start Lap 2', 'Peak Lap 2', 'Finish Lap 2', 'Start Lap 3'] 

Похоже, что я должен быть в состоянии начать с (1..Float::INFINITY) и получить правый результат с #map или #each, но мне не повезло. Я знаю, что могу использовать (1..arbitrary_big_number) и сделать большой массив, но надеясь на ленивое решение.

Заранее спасибо.

ответ

3

Попробуйте один

enum = Enumerator.new do |y| 
    lap = 1 
    ss = %w(Start Peak Finish).cycle 
    loop do 
    3.times { y << "#{ss.next} Lap #{lap}" } 
    lap += 1 
    end 
end 

enum.first(7) 
=> ["Start Lap 1", "Peak Lap 1", "Finish Lap 1", "Start Lap 2", "Peak Lap 2", "Finish Lap 2", "Start Lap 3"] 
+0

Хороший ответ. Вы можете немного очистить его и сделать его более общим: 'loop do (arr_count) .times do y <<" # {cycle_e.next} # {добавлено_слово} # {lap} " конец lap + = 1 конец' – 7stud

+0

Done. Спасибо, братан;) – Ursus

+1

(также уведомляет @ 7stud): Мой вопрос был помечен как дубликат, но я дополнительно обобщил ваш код и представил его в качестве ответа на исходный вопрос [здесь] (http://stackoverflow.com/a/41686275/5961578). Я думаю, что это лучшее решение, чем любой из ответов на этот вопрос. В очередной раз благодарим за помощь! – moveson

Смежные вопросы