如何在Ruby中迭代一系列范围?

时间:2011-02-10 05:50:30

标签: ruby arrays range enumeration

如果您有一系列范围,例如[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 个答案:

答案 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