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 return
s 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?
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.