Issue #5798 has been updated by Alexey Muranov.


I agree that the behavior you point out seems inconsistent, because

(0..1).include?(0.5)
=> true

----------------------------------------
Bug #5798: Range#include? needs some optimization
https://bugs.ruby-lang.org/issues/5798

Author: Joey Zhou
Status: Open
Priority: Normal
Assignee: 
Category: 
Target version: 
ruby -v: 1.9.3p0


For example:

('aa'..'az').include? 123

it seems that the procedure is:

1. check whether 'aa' == 123 # false
2. 'aa'.succ # 'ab'
3. check whether 'ab' == 123 # false
4. 'ab'.succ # 'ac'
5. check whether 'ac' == 123 # false
...
n-1. 'ay'.succ # 'az'
n. check whether 'az' == 123 # false
finally return false

However, 'aa' and 123 are not the same class. It's not necessary to take the whole steps of 'succ' and '=='.
Maybe it should check 'aa'.class and 123.class first, or use <=> instead of == to check, when 'aa' <=> 123 returns nil(== only returns true/false, no nil), the procedure breaks.



-- 
http://redmine.ruby-lang.org