Project

General

Profile

Bug #11406

Inconsistent behavior when creating a range of strings which end in an integer greater than 10

Added by iMIchael (Michael Martinez) about 4 years ago. Updated 26 days ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:70176]

Description

Steps to Reproduce

In Ruby v2.2.2

  1. Create a range of strings using 'foo1' up to 'foo9':

    ('foo1'..'foo9').to_a
    => ["foo1", "foo2", "foo3", "foo4", "foo5", "foo6", "foo7", "foo8", "foo9"]
    

    Observe the results are as we expect

  2. Create a range of strings using 'foo1' up to 'foo10'

    ('foo1'..'foo10').to_a
    => ["foo1", "foo2","foo3","foo4","foo5", "foo6", "foo7", "foo8", "foo9", "fop0","fop1", "fop2", "fop3", "fop4", "fop5", "fop6", "fop7", "fop8", "fop9", "foq0", ....]
    

    Also:

    ('foo1'..'foo10').to_a.size
    => 4707939
    

    Observe that the output loops 1..9 about 523104 times (arbitrarily?)

Expected Results

The output in step 1 makes me expect for Ruby's range class to intelligently create ranges using a strings that include integers inside them. However this only seems to work for 1..9 ranges.

Actual Results

Inconsistent behavior for range creation.


Files

Screen Shot 2015-07-29 at 5.40.16 PM.png (54.4 KB) Screen Shot 2015-07-29 at 5.40.16 PM.png iMIchael (Michael Martinez), 07/30/2015 12:40 AM

History

Updated by nobu (Nobuyoshi Nakada) about 4 years ago

  • Description updated (diff)

It's not inconsistent, but derived from the behavior of String#succ.

p "foo9".succ #=> "fop0"

And it ended with "zzzz9", or exceeds the length of "foo10".

I agree that the current behavior is less convenient in such cases.

Updated by Hanmac (Hans Mackowiak) about 4 years ago

i think that might break some things ... (it might break some applications)

like with "1.2.9".succ, i dont know if that still work

Updated by nobu (Nobuyoshi Nakada) about 4 years ago

Hans Mackowiak wrote:

i think that might break some things ... (it might break some applications)

like with "1.2.9".succ, i dont know if that still work

String#succ isn't changed at all with my patch, but only String#upto when the receiver and the limit share common prefix and numerical suffixes.

The case affected is that alphabetical part is followed by the numerical suffix.
E.g.,

"1a2b9".upto("1a2b10").to_a

returns an empty array now, but ["1a2b9", "1a2b10"] with this patch.

In other words, your example has been handled specially already.

#5

Updated by jeremyevans0 (Jeremy Evans) 26 days ago

  • Status changed from Open to Closed

Also available in: Atom PDF