Project

General

Profile

Feature #16818

Rename `Range#%` to `Range#/`

Added by sawa (Tsuyoshi Sawada) 4 months ago. Updated 3 months ago.

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

Description

Range#% was introduced as an alias of Range#step by 14697, but it is counter-intuitive and confusing.

Iteration in the following:

((5..14) % 3).each{|i| p i}
#>> 5
#>> 8
#>> 11
#>> 14

is not based on x % y in any sense. In fact, actually applying % 3 to the selected elements returns a unique value 2, and it is not obvious how this is related to the iteration.

[5, 8, 11, 14].map{|i| i % 3}
# => [2, 2, 2, 2]

Rather, the concept seems to be based on /. Applying / 3 to the relevant elements returns a sequence 1, 2, 3, 4.

[5, 8, 11, 14].map{|i| i / 3}
# => [1, 2, 3, 4]

Hence, (5..14).step(3) can be interpreted like this: Iterate over the equivalence class (quotient set) of range 5..14 yielded by / 3.

Notice that the number of elements in [5, 8, 11, 14] is 4, which is (14 - 5 + 1) / 3.0).ceil, but is not related to %.

So I propose that the alias of Range#step should be Range#/, and Range#% should be deprecated as soon as possible before its use accumulates:

((5..14) / 3).each{|i| p i}
#>> 5
#>> 8
#>> 11
#>> 14

P.S.

And if Range#% were to be introduced at all, I would rather expect it to behave like the following:

((5..14) % 3).each{|i| p i}
#>> 5
#>> 6
#>> 7

which is why I claimed above that the current Range#% is confusing.

Also available in: Atom PDF