Project

General

Profile

Feature #15573

Permit zero step in Numeric#step and Range#step

Added by mrkn (Kenta Murata) 5 months ago. Updated 4 months ago.

Status:
Open
Priority:
Normal
Target version:
-
[ruby-core:91324]

Description

Numeric#step disallows zero in the 2nd argument, but it allows zero passed as the value of by: keyword argument. I confirmed that this inconsistency exists since 2.3. I want to allow zero in the 2nd argument, too.

>> 1.step(10, by: 0) { break }
=> nil
>> 1.step(10, 0) { break }
Traceback (most recent call last):
        5: from /Users/mrkn/.rbenv/versions/2.6.0/bin/irb:23:in `<main>'
        4: from /Users/mrkn/.rbenv/versions/2.6.0/bin/irb:23:in `load'
        3: from /Users/mrkn/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
        2: from (irb):5
        1: from (irb):5:in `step'
ArgumentError (step can't be 0)

Moreover, Range#step disallows zero if a block is given. I want to relax also this restriction.

>> (1..10).step(0) { break }
Traceback (most recent call last):
        6: from /Users/mrkn/.rbenv/versions/2.6.0/bin/irb:23:in `<main>'
        5: from /Users/mrkn/.rbenv/versions/2.6.0/bin/irb:23:in `load'
        4: from /Users/mrkn/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
        3: from (irb):6
        2: from (irb):6:in `rescue in irb_binding'
        1: from (irb):6:in `step'
ArgumentError (step can't be 0)

History

#1

Updated by mrkn (Kenta Murata) 5 months ago

  • Description updated (diff)

Updated by shyouhei (Shyouhei Urabe) 5 months ago

mrkn (Kenta Murata) wrote:

I want to relax also this restriction.

Tell us why? Consistency?

Updated by sawa (Tsuyoshi Sawada) 5 months ago

There is also inconsistency in that, without the block, 0 is allowed in these forms.

1.step(10, 0) # => ok
1.step(10, 0){} # => ArgumentError: step can't be 0
(1..10).step(0) # => ok
(1..10).step(0){} # => ArgumentError: step can't be 0

Since 0 can already sneak in, disallowing it just when the block is given makes it confusing. I agree that it should be relaxed.

Oops, sorry for the post if this was what mfkn has already pointed out.

Updated by shevegen (Robert A. Heiler) 5 months ago

I can't say in which way to change it but I think this is indeed surprising
behaviour and should be changed either way towards more consistency
if possible.

Updated by mrkn (Kenta Murata) 4 months ago

Tell us why? Consistency?

The reason is that zero step allows when the block is not given.

>> 1.step(10, 0).each { break }
=> nil
irb(main):005:0> (1..10).step(0)
=> ((1..10).step(0))
>> (1..10).step(0).each { break }
=> nil

Updated by matz (Yukihiro Matsumoto) 4 months ago

For this case, consistency matters. I thought it is better to raise an error on zero step. But mrkn (Kenta Murata) can choose whatever behavior he believes right.

Matz.

#7

Updated by mrkn (Kenta Murata) 4 months ago

  • Assignee changed from matz (Yukihiro Matsumoto) to mrkn (Kenta Murata)

Also available in: Atom PDF