From: franck@... Date: 2014-11-18T14:31:27+00:00 Subject: [ruby-core:66346] [ruby-trunk - Feature #10498] Make `loop` yield a counter Issue #10498 has been updated by Franck Verrot. Hi Robert, thanks for taking time reading the ticket. Robert Klemme wrote: > I am actually against this feature. Reason: an infinite loop does not need a counter. Most examples I can find about it (and use personally when teaching) make use of a counter (all languages). Keeping track of the current iteration can be useful. > We incur the cost of counting (especially when the figure leaves Fixnum space) on all infinite loops. I definitely agree . I wasn't able to find a way to fine-tune this based on the block's arity as mentioned previously. On the other hand, you'd need 4,611,686,018,427,387,903 iterations before paying the price of using `BigNum`s, which compared to the code you're having in the block would probably be more expensive than incrementing a `BigNum`. So I'm not sure whether or not that price should be considered high. Anything I'm missing? > ~~~ > x = Enumerator::Generator.new {|y| i = -1; loop {y << (i += 1)}} > ~~~ > > If needed that can be made a constant somewhere, e.g. in Enumerator. Given the context, I'm afraid I wouldn't use this unless it's a well-known constant. Thanks again, looking forward to more insights :-) ---------------------------------------- Feature #10498: Make `loop` yield a counter https://bugs.ruby-lang.org/issues/10498#change-50000 * Author: Franck Verrot * Status: Open * Priority: Normal * Assignee: ruby-core * Category: core * Target version: current: 2.2.0 ---------------------------------------- # Problem Teaching Ruby, we always end up with that type of construct ```ruby i = 0 loop do i += 1 # do something with i.... raise StopIteration if i ... end ``` # Solution What I propose with this patch is making `loop` yield the iteration count: ```ruby loop do |i| # do something with i.... raise StopIteration if i ... end ``` `i` starts at 0 and stops at `FIXNUM_MAX` (there's no `Float::Infinity` equivalent for integers). # Alternate solution `Integer#times` could work if we had an `` object, so we would just do `.times { |i| ... }`. Also, this is the very first patch I submit to Ruby, I might have done something horrible, feel free to tell me :-) ---Files-------------------------------- 0001-vm_eval.c-loop-now-yields-a-incremented-counter.patch (1.74 KB) 0001-vm_eval.c-loop-now-yields-a-incremented-counter.patch (1.86 KB) -- https://bugs.ruby-lang.org/