[#70843] Re: [ruby-cvs:58952] hsbt:r51801 (trunk): * lib/rubygems: Update to RubyGems HEAD(fe61e4c112). — Eric Wong <normalperson@...>
hsbt@ruby-lang.org wrote:
3 messages
2015/09/17
[ruby-core:70644] [Ruby trunk - Feature #11498] [Open] Kernel#loop: return the "result" value of StopIteration
From:
knu@...
Date:
2015-09-01 09:11:30 UTC
List:
ruby-core #70644
Issue #11498 has been reported by Akinori MUSHA.
----------------------------------------
Feature #11498: Kernel#loop: return the "result" value of StopIteration
https://bugs.ruby-lang.org/issues/11498
* Author: Akinori MUSHA
* Status: Open
* Priority: Normal
* Assignee: Yukihiro Matsumoto
----------------------------------------
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)
--
https://bugs.ruby-lang.org/