Comparisons with the Ruby spaceship operator
March 8, 2021 ‐ 2 min read
The spaceship operator (
<=>) is a comparison operator that is implemented by Ruby's
Comparable mixin. With the spaceship operator you can do a three-way comparison, to do the comparisons
> in a single operation. It returns either -1, 0 or 1 depending on if the other object is respectively; less than, equal to, or greater than the other object.
With strings, where the string length is used for the comparison, it gives the following results for example.
puts 'a' <=> 'ab' # => -1 puts 'ab' <=> 'ab' # => 0 puts 'ab' <=> 'a' # => 1
This is internally used by Ruby for sorting arrays. Ruby will swap the places of two adjacent elements in an array if the
<=> comparison has a result of 1. If the result is either -1 or 0 it will leave the elements in place.
letters = ['ab', 'a', 'abc'] puts letters.sort!.inspect # => ["a", "ab", "abc"]
Implementing the Comparable mixin
You can include the
Comparable mixin in your own classes too. If you do so you get the implementation for the conventional comparison operators (
>) and the method
between? for free, since these make use of the
<=> operator. Unless you overwrite them.
class Book include Comparable attr :pages def <=>(other) pages <=> other.pages end def initialize(str) @str = str end end
You should return
nil if the objects are not comparable using the