Sorry, I have no skills for C programming.
But, I guess the causes from below codes by only my intuition.
# https://github.com/ruby/ruby/blob/trunk/range.c

# -------------------------------------------------------------------------=
----
static int
discrete_object_p(VALUE obj)
{
    if (rb_obj_is_kind_of(obj, rb_cTime)) return FALSE; /* until
Time#succ removed */
    return rb_respond_to(obj, id_succ);
}
# -------------------------------------------------------------------------=
----
static VALUE
range_include(VALUE range, VALUE val)
{
    VALUE beg =3D RANGE_BEG(range);
    VALUE end =3D RANGE_END(range);
    int nv =3D FIXNUM_P(beg) || FIXNUM_P(end) ||
rb_obj_is_kind_of(beg, rb_cNumeric) ||
rb_obj_is_kind_of(end, rb_cNumeric);
# -------------------------------------------------------------------------=
----

It looks specific rules for Time and Numeric.

2012/1/18 Peter Vandenabeele <peter / vandenabeele.com>:
> On Tue, Jan 17, 2012 at 7:44 PM, Kenichi Kamiya <kachick1 / gmail.com> wrot=
e:
>
>> Range#=3D=3D=3D , need #succ method in Ruby1.9.3
>> under =A0only #<=3D>, =A0use Range#cover?
>>
>
> Thank you. For Time class, I could get it to work.
>
> This will simplify the code for the OP.
>
> $ irb
> 1.9.3-p0 :001 > t2 =3D Time.now
> =A0=3D> 2012-01-17 19:47:19 0100
>
> 1.9.3-p0 :002 > t1 =3D t2 - 900
> =A0=3D> 2012-01-17 19:32:19 0100
>
> 1.9.3-p0 :003 > time_range =3D t1..t2
> =A0=3D> 2012-01-17 19:32:19 0100..2012-01-17 19:47:19 0100
>
> 1.9.3-p0 :004 > t3 =3D Time.now - 300
> =A0=3D> 2012-01-17 19:42:41 0100
>
> 1.9.3-p0 :006 > time_range =3D=3D=3D t3
> TypeError: can't iterate from Time
> =A0 =A0from (irb):6:in `each'
> =A0 =A0from (irb):6:in `include?'
> =A0 =A0from (irb):6:in `include?'
> =A0 =A0from (irb):6:in `=3D=3D=3D'
> =A0 =A0from (irb):6
> =A0 =A0from /home/peterv/.rvm/rubies/ruby-1.9.3-p0/bin/irb:16:in `<main>'
>
> 1.9.3-p0 :007 > time_range.cover? t3
> =A0=3D> true =A0# :-)
>
> 1.9.3-p0 :008 > time_range.cover? Time.now
> =A0=3D> false # :-)
>
> However, for Float the =3D=3D=3D operator seems to work, _without_ Float#=
succ
>
> 1.9.3-p0 :009 > f1 =3D 13.6
> =A0=3D> 13.6
> 1.9.3-p0 :010 > f2 =3D 18.6
> =A0=3D> 18.6
> 1.9.3-p0 :011 > float_range =3D f1..f2
> =A0=3D> 13.6..18.6
> 1.9.3-p0 :012 > float_range =3D=3D=3D 15.5
> =A0=3D> true
> 1.9.3-p0 :013 > f1.succ
> NoMethodError: undefined method `succ' for 13.6:Float
> =A0 =A0from (irb):13
> =A0 =A0from /home/peterv/.rvm/rubies/ruby-1.9.3-p0/bin/irb:16:in `<main>'
> 1.9.3-p0 :014 > float_range.cover? 15.5
> =A0=3D> true
>
>
> So, maybe the behavior could be made similar?
>
> I suggest that `Range#=3D=3D=3D =A0arg` falls back to `Range#cover? arg`
> uniformily if `arg.respond_to?(:succ)` is false (and probably other
> conditions).
>
> Thanks again,
>
> Peter