2011-02-10 56 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

有没有范围的任何机会重叠? – 2011-02-10 06:20:29

回答

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