The Comparable
mixin is used by classes whose objects may be
ordered. The class must define the <=>
operator, which
compares the receiver against another object, returning -1, 0, or +1
depending on whether the receiver is less than, equal to, or greater than
the other object. If the other object is not comparable then the
<=>
operator should return nil. Comparable
uses <=>
to implement the conventional comparison
operators (<
, <=
, ==
,
>=
, and >
) and the method
between?
.
class SizeMatters include Comparable attr :str def <=>(anOther) str.size <=> anOther.str.size end def initialize(str) @str = str end def inspect @str end end s1 = SizeMatters.new("Z") s2 = SizeMatters.new("YY") s3 = SizeMatters.new("XXX") s4 = SizeMatters.new("WWWW") s5 = SizeMatters.new("VVVVV") s1 < s2 #=> true s4.between?(s1, s3) #=> false s4.between?(s3, s5) #=> true [ s3, s2, s5, s4, s1 ].sort #=> [Z, YY, XXX, WWWW, VVVVV]
Compares two objects based on the receiver’s <=>
method,
returning true if it returns -1.
static VALUE cmp_lt(VALUE x, VALUE y) { VALUE c = rb_funcall(x, cmp, 1, y); if (rb_cmpint(c, x, y) < 0) return Qtrue; return Qfalse; }
Compares two objects based on the receiver’s <=>
method,
returning true if it returns -1 or 0.
static VALUE cmp_le(VALUE x, VALUE y) { VALUE c = rb_funcall(x, cmp, 1, y); if (rb_cmpint(c, x, y) <= 0) return Qtrue; return Qfalse; }
Compares two objects based on the receiver’s <=>
method,
returning true if it returns 0. Also returns true if obj and
other are the same object.
static VALUE cmp_equal(VALUE x, VALUE y) { VALUE a[2]; if (x == y) return Qtrue; a[0] = x; a[1] = y; return rb_rescue(cmp_eq, (VALUE)a, cmp_failed, 0); }
Compares two objects based on the receiver’s <=>
method,
returning true if it returns 1.
static VALUE cmp_gt(VALUE x, VALUE y) { VALUE c = rb_funcall(x, cmp, 1, y); if (rb_cmpint(c, x, y) > 0) return Qtrue; return Qfalse; }
Compares two objects based on the receiver’s <=>
method,
returning true if it returns 0 or 1.
static VALUE cmp_ge(VALUE x, VALUE y) { VALUE c = rb_funcall(x, cmp, 1, y); if (rb_cmpint(c, x, y) >= 0) return Qtrue; return Qfalse; }
Returns false
if obj <=>
min is less than zero or if anObject <=>
max is
greater than zero, true
otherwise.
3.between?(1, 5) #=> true 6.between?(1, 5) #=> false 'cat'.between?('ant', 'dog') #=> true 'gnu'.between?('ant', 'dog') #=> false
static VALUE cmp_between(VALUE x, VALUE min, VALUE max) { if (RTEST(cmp_lt(x, min))) return Qfalse; if (RTEST(cmp_gt(x, max))) return Qfalse; return Qtrue; }
Commenting is here to help enhance the documentation. For example, sample code, or clarification of the documentation.
If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.
If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.