Search code examples
rubysortingcomparison-operators

How does Ruby's sort method work with the combined comparison (spaceship) operator?


Beginning programmer here, just wanting to understand the process behind Ruby's sort method when using the spaceship operator <=>. Hope someone can help.

In the following:

array = [1, 2, 3]
array.sort { |a, b| a <=> b }

... I understand that sort is comparing a pair of numbers at a time and then returning -1 if a belongs before b, 0 if they're equal, or 1 if a should follow b.

But in the case of sorting in descending order, like so:

array.sort { |a, b| b <=> a }

... what exactly is happening? Does sort still compare a <=> b and then flip the result? Or is it interpreting the returns of -1, 0 and 1 with reversed behavior?

In other words, why does placing the variables in the block like so:

array.sort { |b, a| b <=> a }

...result in the same sorting pattern as in the first example?


Solution

  • a <=> b will return -1 if a belongs before b, 0 if they're equal, or 1 if a should follow b.
    b <=> a will return -1 if b belongs before a, 0 if they're equal, or 1 if b should follow a.

    Since you are reversing the order, the output should be reversed, just like the - operator, for example. 3-5 is -2, and 5-3 is 2.

    array.sort { |b, a| b <=> a } is equal to array.sort { |a, b| a <=> b } because the first argument is before the spaceship, and the second is after. Ruby doesn't care what the name of the variable is.