diff options
author | Takashi Kokubun <takashikkbn@gmail.com> | 2022-12-25 21:46:29 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-25 21:46:29 -0800 |
commit | 509da028c2249cd386190f2856e91549cc9e6c23 (patch) | |
tree | e85a575800cb14245f8acbb0ffe369b22761912c /kernel.rb | |
parent | a236661a62dc89173dcdd9e071365929db1201a7 (diff) |
Rewrite Kernel#loop in Ruby (#6983)
* Rewrite Kernel#loop in Ruby
* Use enum_for(:loop) { Float::INFINITY }
Co-authored-by: Ufuk Kayserilioglu <ufuk@paralaus.com>
* Limit the scope to rescue StopIteration
Co-authored-by: Ufuk Kayserilioglu <ufuk@paralaus.com>
Notes
Notes:
Merged-By: k0kubun <takashikkbn@gmail.com>
Diffstat (limited to 'kernel.rb')
-rw-r--r-- | kernel.rb | 41 |
1 files changed, 41 insertions, 0 deletions
@@ -150,6 +150,47 @@ module Kernel module_function + # call-seq: + # loop { block } + # loop -> an_enumerator + # + # Repeatedly executes the block. + # + # If no block is given, an enumerator is returned instead. + # + # loop do + # print "Input: " + # line = gets + # break if !line or line =~ /^q/i + # # ... + # end + # + # StopIteration raised in the block breaks the loop. In this case, + # loop returns the "result" value stored in the exception. + # + # enum = Enumerator.new { |y| + # y << "one" + # y << "two" + # :ok + # } + # + # result = loop { + # puts enum.next + # } #=> :ok + def loop + unless Primitive.block_given_p + return enum_for(:loop) { Float::INFINITY } + end + + begin + while true + yield + end + rescue StopIteration => e + e.result + end + end + # # call-seq: # Float(arg, exception: true) -> float or nil |