Project

General

Profile

Feature #11498

Kernel#loop: return the "result" value of StopIteration

Added by knu (Akinori MUSHA) almost 5 years ago. Updated almost 5 years ago.

Status:
Closed
Priority:
Normal
Target version:
-
[ruby-core:<unknown>]

Description

Kernel#loop wraps use of Enumerator rescuing StopIteration raised by Enumerator#next, but it does not provide access to the "result" value of a finished enumerator.
If you wanted to get it, you'd have to rescue StopIteration by yourself.

result = loop {
  begin
    puts enum.next
  rescue StopIteration => exc
    break exc.result
  end
}

This feels awkward when loop is capable of rescuing the exception.

So, my proposal here is to make Kernel#loop return the "result" value, which currently returns nothing (nil).
Kernel#loop takes a "return" of an enumerator (StopIteration) as "break" of a loop, so it should be natural to be able to carry a returned value through to the caller like it was given with "break".

With this enhancement, you could write something like this:

enum = Enumerator.new { |y|
  y << 1
  y << 2
  :ok
}

result = loop {
  puts enum.next
} #=> :ok

Attached is my implementation.


Files

loop-result.patch (3.03 KB) loop-result.patch knu (Akinori MUSHA), 09/01/2015 09:09 AM

Also available in: Atom PDF