summaryrefslogtreecommitdiff
path: root/kernel.rb
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2022-12-25 21:46:29 -0800
committerGitHub <noreply@github.com>2022-12-25 21:46:29 -0800
commit509da028c2249cd386190f2856e91549cc9e6c23 (patch)
treee85a575800cb14245f8acbb0ffe369b22761912c /kernel.rb
parenta236661a62dc89173dcdd9e071365929db1201a7 (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.rb41
1 files changed, 41 insertions, 0 deletions
diff --git a/kernel.rb b/kernel.rb
index 9cc58bc1d9..32e7dac42f 100644
--- a/kernel.rb
+++ b/kernel.rb
@@ -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