From: Robert Klemme Date: 2010-04-03T22:30:04+09:00 Subject: Re: combined ranges... On 04/03/2010 01:50 PM, Colin Bartlett wrote: > On Fri, Apr 2, 2010 at 11:33 PM, Roger Pack wrote: >> David Springer wrote: >>> Will this work: >>> [1..20,30..46].each{|r| r.each {|n| p n}} >> Yeah that works. >> I guess if I need individual values in there (like 25) I can do >> [1..20, 25..25, 30..46].each{|r| r.each {|n| p n}} > > Given the solutions proposed, in suggesting this I have a feeling > I may well be missing something, but since I might learn something: > why not write a method (and maybe add it to Array) like: > > def each_element_or_range_element( arr ) > arr.each do |er| > if er.kind_of?( Range ) then er.each { |e| yield e } > else yield er > end > end > end Here's my general purpose solution: module Enumerable def each_flat(levels, &b) each do |x| if levels > 1 && Enumerable === x x.each_flat(levels - 1, &b) else b[x] end end self end end a = [ 1, 2, 10..15, 3, 4, [99,100,101,["no more"]], ] a.each_flat 2 do |x| p x end Kind regards robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/