Как мне перебрать массив диапазонов в Ruby? - PullRequest
4 голосов
/ 10 февраля 2011

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

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

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

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

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

1 Ответ

5 голосов
/ 10 февраля 2011

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

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
...