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