Module: Comparable

Included in:
File::Stat, Numeric, String, Symbol, Time
Defined in:
compar.c

Overview

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]``````

Instance Method Summary (collapse)

• Compares two objects based on the receiver's method, returning true if it returns -1.

• Compares two objects based on the receiver's method, returning true if it returns -1 or 0.

• Compares two objects based on the receiver's method, returning true if it returns 0.

• Compares two objects based on the receiver's method, returning true if it returns 1.

• Compares two objects based on the receiver's method, returning true if it returns 0 or 1.

• Returns false if obj min is less than zero or if anObject max is greater than zero, true otherwise.

Instance Method Details

- (Boolean) <(other)

Compares two objects based on the receiver's <=> method, returning true if it returns -1.

Returns:

• (Boolean)
 ``` ``` ```# File 'compar.c' /* * call-seq: * obj < other -> true or false * * 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; }```

- (Boolean) <=(other)

Compares two objects based on the receiver's <=> method, returning true if it returns -1 or 0.

Returns:

• (Boolean)
 ``` ``` ```# File 'compar.c' /* * call-seq: * obj <= other -> true or false * * 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; }```

- (Boolean) ==(other)

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.

Returns:

• (Boolean)
 ``` ``` ```# File 'compar.c' /* * call-seq: * obj == other -> true or false * * 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); }```

- (Boolean) >(other)

Compares two objects based on the receiver's <=> method, returning true if it returns 1.

Returns:

• (Boolean)
 ``` ``` ```# File 'compar.c' /* * call-seq: * obj > other -> true or false * * 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; }```

- (Boolean) >=(other)

Compares two objects based on the receiver's <=> method, returning true if it returns 0 or 1.

Returns:

• (Boolean)
 ``` ``` ```# File 'compar.c' /* * call-seq: * obj >= other -> true or false * * 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; }```

- (Boolean) between?(min, max)

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``````

Returns:

• (Boolean)
 ``` ``` ```# File 'compar.c' /* * call-seq: * obj.between?(min, max) -> true or false * * 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; }```