Feature #9587

Integer#times with optional starting value

Added by Tsuyoshi Sawada about 1 year ago. Updated about 1 year ago.

[ruby-core:61233]
Status:Open
Priority:Normal
Assignee:-

Description

Just like Enumerator#with_index takes an optional argument that specifies the initial value of the index, I would like to request that Integer#times take an optional argument that specifies the initial value. The usefulness of it is similar to that of with_index taking an argument. We sometimes want to repeat tasks a given number of times, and want to use an index not necessarily starting from 0.

6.times(1){|i| puts "Chapter #{i}"}

should give

Chapter 1
Chapter 2
Chapter 3
Chapter 4
Chapter 5
Chapter 6

with the return value 6. We can do it with 1.upto(6), or with #{i + 1} within the block, but giving the initial value to times is much easier.

History

#1 Updated by Marc-Andre Lafortune about 1 year ago

How exactly would it be easier than 1.upto(6)?

#2 Updated by Tsuyoshi Sawada about 1 year ago

Marc-Andre Lafortune wrote:

How exactly would it be easier than 1.upto(6)?

When the start value is 1, the argument 6 of upto coincidentally matches what would be the receiver of times, and you may not see the benifit, but when it is some other value such as 5, then you would need to calculate that in mind:

5.upto(10) # Need to calculate 10 (= 5 + 6 - 1)
6.times(5) # This is easier

A use case maybe when you are writing labels for pagination buttons. You know the start value, say 17, and you want to display ten next pages. Then,

10.times(17){|i| ...}

would give i = 17, 18, ..., 26. Doing this with upto or addition to the index within a times block may be a cause of careless bugs. (In the code above, I used an explicit number 17, but in real code, it would perhaps be some variable.)

#3 Updated by Benoit Daloze about 1 year ago

"10.times(17)" is 170 at me, so it definitely is not an option as an unnamed argument.

#4 Updated by Matthew Kerwin about 1 year ago

On Mar 3, 2014 10:25 PM, eregontp@gmail.com wrote:

"10.times(17)" is 170 at me, so it definitely is not an option as an
unnamed argument.

Strongly agree. Maybe suggest: 10.times(from: 17)

Also available in: Atom PDF