Issue #6824 has been updated by ko1 (Koichi Sasada).

Assignee set to mame (Yusuke Endoh)

mame-san, could you judge this ticket?
----------------------------------------
Feature #6824: StopIteration gets a source method
https://bugs.ruby-lang.org/issues/6824#change-31707

Author: jasiek (Jan Szumiec)
Status: Open
Priority: Normal
Assignee: mame (Yusuke Endoh)
Category: core
Target version: 2.0.0


=begin
I'd like to add a method to StopIteration that returns an instance of the enumerator which triggered this exception. Eg:

  enum = [].each
  begin
    enum.next
  rescue StopIteration => ex
    puts "same" if ex.source == enum
  end

This is useful when you're merging multiple collections using min/max - when one of the collections is exhausted it can be easily ignored.

  enumerators = 100.times.map do
    rand(100).times.map do
      rand
    end.sort.each
  end

  merged = []
  while !enumerators.empty?
    begin
      enumerators.map(&:peek)
      values = enumerators.map(&:next)

      merged += values.sort
    rescue StopIteration => e
      enumerators.delete(e.source)
      retry
    end
  end

  fail unless merged != merged.sort

Attached is a patch against trunk.
=end




-- 
http://bugs.ruby-lang.org/