如何在Ruby中遍历范围数组?

如何在Ruby中遍历范围数组?,ruby,arrays,range,enumeration,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 #{d

如果您有一个范围数组,例如
[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
这有点冗长,或者我可以

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
如果范围较大,可能会占用大量内存


还有其他选择吗?

好吧,我不认为你的第一个答案太冗长,但如果这种模式得到足够多的使用,可能会有这样的情况出现-

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

有可能范围重叠吗?在我的场景中,它们不会重叠,但如果重叠,我希望只重复一次。在这种情况下,您的第一个示例对我来说非常清晰。我很想看看是否有人有更简单的东西。