Feature #15573
Permit zero step in Numeric#step and Range#step
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
Updated by shyouhei (Shyouhei Urabe) 10 months ago
mrkn (Kenta Murata) wrote:
I want to relax also this restriction.
Tell us why? Consistency?
Updated by sawa (Tsuyoshi Sawada) 10 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) 10 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) 10 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) 10 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.
Updated by mrkn (Kenta Murata) 10 months ago
- Assignee changed from matz (Yukihiro Matsumoto) to mrkn (Kenta Murata)