On Fri, May 30, 2003 at 08:33:15PM +0900, Carlos wrote:
> > Is there any built in functionality for iteration that will allow me to 
> > detect when I am on the last element?
...
> Here is a module that implements it, but you should include it in every
> class where you want #each to behave that way :-/.
...
> 	def EachWithLast.append_features(klass)
> 		old_each="each_"+rand(10000).to_s+Time.now.usec.to_s
> 		klass.class_eval <<-FINISH

Err??!

I must be missing something; why is this not an incredibly simple thing to
achieve?

module Enumerable
  def each_with_last
    prev = nil
    each_with_index do |item,index|
      yield prev,false if index > 0
      prev = item
    end
    yield prev,true
  end
end

irb(main):011:0> [1,2,3,4,5].each_with_last do |a,b| puts a,b; end
1
false
2
false
3
false
4
false
5
true

It was Nobu's comment that this should work with IO which made me think it
must work this way: you simply keep reading items until there are no more
(eof in the case of IO), and then you yield with 'true' for the last one.

But like I say, I might have missed something...

Regards,

Brian.