如何在Ruby中迭代一个范围数组?

4
如果您有一个范围数组,例如[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

如果范围很大,这可能会使用大量内存。

是否有其他选择?


有没有可能出现范围重叠? - Jimmy
在我的情况下它们没有重叠,但如果它们有重叠,我希望只执行一次。 - Andrew Grimm
在这种情况下,你的第一个例子对我来说看起来相当干净。不过,如果有人有更简单的东西,我会很感兴趣的。 - Jimmy
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接