module Comparable
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 a value less than 0, returning 0, or returning a value greater than 0, 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 StringSorter include Comparable attr :str def <=>(other) str.size <=> other.str.size end def initialize(str) @str = str end def inspect @str end end s1 = StringSorter.new("Z") s2 = StringSorter.new("YY") s3 = StringSorter.new("XXX") s4 = StringSorter.new("WWWW") s5 = StringSorter.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]
What’s Here
Module Comparable provides these methods, all of which use method #<=>:
-
<: Returns whetherselfis less than the given object. -
<=: Returns whetherselfis less than or equal to the given object. -
==: Returns whetherselfis equal to the given object. -
>: Returns whetherselfis greater than the given object. -
>=: Returns whetherselfis greater than or equal to the given object. -
between?: Returnstrueifselfis between two given objects. -
clamp: For given objectsminandmax, or range(min..max), returns:-
minif(self <=> min) < 0. -
maxif(self <=> max) > 0. -
selfotherwise.
-
Public Instance Methods
(untyped other) → bool
Source
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/comparable.rbs, line 69
def <: (untyped other) -> bool
Returns whether self is “less than” other; equivalent to (self <=> other) < 0:
'foo' < 'foo' # => false 'foo' < 'food' # => true
(untyped other) → bool
Source
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/comparable.rbs, line 82
def <=: (untyped other) -> bool
Returns whether self is “less than or equal to” other; equivalent to (self <=> other) <= 0:
'foo' <= 'foo' # => true 'foo' <= 'food' # => true 'food' <= 'foo' # => false
(untyped other) → bool
Source
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/comparable.rbs, line 92
def ==: (untyped other) -> bool
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.
(untyped other) → bool
Source
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/comparable.rbs, line 101
def >: (untyped other) -> bool
Compares two objects based on the receiver’s <=> method, returning true if it returns a value greater than 0.
(untyped other) → bool
Source
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/comparable.rbs, line 110
def >=: (untyped other) -> bool
Compares two objects based on the receiver’s <=> method, returning true if it returns a value greater than or equal to 0.
(untyped min, untyped max) → bool
Source
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/comparable.rbs, line 124
def between?: (untyped min, untyped max) -> bool
Returns false if obj <=> min is less than zero or if obj <=> 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
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/comparable.rbs, line 170
def clamp: [A, B] (A min, B max) -> (self | A | B)
| [A] (Range[A]) -> (self | A)
In (min, max) form, returns min if obj <=> min is less than zero, max if obj <=> max is greater than zero, and obj otherwise.
12.clamp(0, 100) #=> 12 523.clamp(0, 100) #=> 100 -3.123.clamp(0, 100) #=> 0 'd'.clamp('a', 'f') #=> 'd' 'z'.clamp('a', 'f') #=> 'f'
If min is nil, it is considered smaller than obj, and if max is nil, it is considered greater than obj.
-20.clamp(0, nil) #=> 0 523.clamp(nil, 100) #=> 100
In (range) form, returns range.begin if obj <=> range.begin is less than zero, range.end if obj <=> range.end is greater than zero, and obj otherwise.
12.clamp(0..100) #=> 12 523.clamp(0..100) #=> 100 -3.123.clamp(0..100) #=> 0 'd'.clamp('a'..'f') #=> 'd' 'z'.clamp('a'..'f') #=> 'f'
If range.begin is nil, it is considered smaller than obj, and if range.end is nil, it is considered greater than obj.
-20.clamp(0..) #=> 0 523.clamp(..100) #=> 100
When range.end is excluded and not nil, an exception is raised.
100.clamp(0...100) # ArgumentError