On Feb 9, 2007, at 6:23 PM, Garance A Drosehn wrote:
> I should also say that I am not looking for a quick-fix for some
> specific script that I am writing. This is more of a "blue-sky"
> topic,
> where I am thinking that maybe some future version of ruby could
> introduce a new feature for these situations.
I think that using an array as a queue for processing items is
pretty general. The idea of pushing things back into a queue is
also a reasonably common pattern. You suggested that you didn't
want to change your array during iteration, but if you simply
think of the array as a queue of items then it certainly makes
sense to alter the queue as you process items. You can always dup
the original array if you need continued access to the original
collection.
I gave an illustration with ARGV but the pattern works for any type
of a collection. You can always use Enumerable#to_a to convert
something to an array:
hash = { 1 => 2, 3=>4 }
pairs = hash.to_a
while pair = pairs.shift
# the next pair is available as pairs[0], if necessary
end
Is there some particular reason you prefer iteration via #each over
a while loop? It seems like the problem you described is more general
than the type of iteration provided by #each and so it needs a more
general solution (like a while loop). As you've said, you've managed
to shoehorn in a solution with #each via flags and such, but
perhaps that indicates that #each is simply the wrong pattern for your
use cases.
It isn't entirely clear to me from the single example what 'pattern'
you are trying to implement. Perhaps posting another use
case would generate some more suggestions.
Gary Wright