From: David Flanagan Date: 2007-09-26T09:38:00+09:00 Subject: next method and for loop With the introduction of external iterators and the python-like next method and StopIteration exception, I'm wondering if there is any thought of somehow enabling the for/in loop to work with objects that implement next but do not implement each. As it stands now there is an asymmetry between internal and external iterators. If I implement a class with an each method for internal iteration, I can use to_enum to get an Enumerator object that has a next method for external iteration. But if I implement a class that natively uses external iteration and implements next, there is no automatic way to get an internal iterator for the class. I can't use for/in on instances of my class. I don't have a to_enumerable method I can call on an instance. And there is no module I can include that will define an each method based on my next method. I'm not sure that this is a problem, but it is an asymmetry that might bother programmers migrating from Python, and it might be quite easy to address. I believe, for example that a general-purpose each method can be implemented in terms of next as follows: def each loop do # Note that loop exits cleanly on StopIteration in 1.9 yield self.next end end So what if we had a (built-in) module something like this: module Iterable # What's a better name for this? ExternallyEnumerable? include Enumerable def each loop { yield self.next } end end Then classes that wanted to be enumerable would have a choice. They could a) define each and include Enumerable b) define next and include Iterable Am I making any sense here? This isn't something I'm advocating strongly for; but it is an idea I would like to get out there. A simple demo program follows David module Iterable include Enumerable def each loop { yield self.next } end end class Countdown include Iterable def initialize(x) @x = x end def next raise StopIteration if @x <= 0 @x -= 1 end end f = Countdown.new(10) for i in f puts i end