Feature #11498
closedKernel#loop: return the "result" value of StopIteration
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.
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:
Attached is my implementation.
Files
Updated by matz (Yukihiro Matsumoto) over 10 years ago
I like the idea. If anything bad happens by the patch, I'd love to accept this.
Matz.
Updated by knu (Akinori MUSHA) over 10 years ago
- Status changed from Open to Closed
Applied in changeset r52218.
Kernel#loop returns the result value of a finished iterator
- vm_eval.c (rb_f_loop): When a loop is stopped by a StopIteration
exception, return what the enumerator has returned instead of
nil. [ruby-core:71133] [Feature #11498]