2011-02-10 1 views
4

Если у вас есть диапазон диапазонов, например [1..4, 7..11, 14..18, 21..25, 28..28], какие параметры у меня есть для итерации по элементам?Как выполнить итерацию по массиву диапазонов в Ruby?

я мог бы сделать

ranges.each do |range| 
    range.each do |date| 
    puts "Do work on February #{date}" 
    end 
end 

который немного многословным, или я мог бы сделать

dates = ranges.map(&:to_a).flatten 
dates.each do |date| 
    puts "Do work on February #{date}" 
end 

, которые могли бы использовать много памяти, если диапазоны велики.

Есть ли альтернативы?

+0

Есть ли шанс диапазонов перекрытие? –

+0

Они не перекрываются в моем сценарии, но если бы они это сделали, я бы хотел, чтобы это было сделано один раз. –

+0

В этом случае ваш первый пример кажется мне довольно чистым. Мне будет интересно узнать, есть ли у кого-то еще более простые вещи. –

ответ

5

Ну, я не думаю, что ваш первый ответ слишком многословный, но если модель привыкает достаточно часто, это может сделать дело, что-то вроде этого -

module Enumerable 
    def each_node 
    each do |x| 
     (x.respond_to?(:each_node)) ? x.each_node{ |y| yield(y) } : yield(x) 
    end 
    end 
end 

[[[(1..5)], (1..2)],1].each_node { |x| print x } #=> 12345121 

ranges = [1..4, 7..11, 14..18, 21..25, 28..28] 
ranges.each_node{ |date| puts "Do work on February #{date}" } #=>as expected