Project

General

Profile

Actions

Bug #22432

open

Range#include? returns true for the end of an empty range of single-character Strings

Bug #22432: Range#include? returns true for the end of an empty range of single-character Strings

Added by sferik (Erik Berlin) about 5 hours ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:127084]

Description

A Range whose ends are both single ASCII characters reports that it includes its end even when the range is empty.

r = "z".."a"
r.to_a          #=> []
r.include?("a") #=> true
r.member?("a")  #=> true
r.cover?("a")   #=> false
r === "a"       #=> false

I expect include? and member? to return false here, as cover? does and as iterating the range implies. The same happens with digits, for example ("1".."0").include?("0").

Only the end is affected. Other values are correctly reported as not included:

("z".."a").include?("z") #=> false
("z".."a").include?("m") #=> false

Range#include? has a shortcut for ranges of single-character Strings, which compares the characters instead of iterating. It is in rb_str_include_range_p in string.c:

if (ISASCII(b) && ISASCII(e) && ISASCII(v)) {
    if (b <= v && v < e) return Qtrue;
    return RBOOL(!RTEST(exclusive) && v == e);
}

The last line returns true whenever the value equals the end, without checking that the begin is not after the end.

No data to display

Actions

Also available in: PDF Atom