Actions
Bug #22432
openRange#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
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:
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