15 getting technical. Alternative way


#1

Hey,

I just wanted to share an alternative way for this exercise.

books.sort! { |firstBook, secondBook| -(firstBook <=> secondBook) }

To reverse the result, we can simply use the opposite of the return of the comparison operator.

  • -1 becomes 1
  • 1 becomes -1
  • and 0 becomes … 0

What do you think?


#2

That works because it uses negative indexes. Clever. However it is a tiny detail that could get lost in the shuffle, and just one more thing to go wrong. I’d favor switching the parameters around to change order.


#3

It’s fine in and of itself, and you’ll find this kind of thing often enough in definitions of comparison operators themselves. But you’re always going to prefer:

books.sort!.reverse!

Which takes 5-10 times less time to read and understand
It also skips having to pass in a block, so it’s likely faster (though unlikely to be significant)

Edit: actually, somewhat significant

require 'benchmark'

sort_me = (1...100_000).to_a.shuffle

Benchmark.bm(10) do |x|
  x.report('sort.reverse   ') { sort_me.sort.reverse }
  x.report('sort with block') { sort_me.sort { |a, b| -(a <=> b) } }
end
                 user     system      total        real
sort.reverse     0.030000   0.000000   0.030000 (  0.022546)
sort with block  0.160000   0.010000   0.170000 (  0.162738)

#4

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.