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

は範囲のいずれかの可能性があります重複? –

+0

私のシナリオでは重複していませんが、そうした場合は一度やりたいと思います。 –

+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 
関連する問題