During a cosmic session of Ruby Tapas with my SeQura colleagues, I unearthed a celestial secret: the Ruby
<=> operator is affectionately named the “spaceship operator”! 🚀
Curious about its out-of-this-world naming? I believe it hearkens back to the retro gaming era from a galaxy far, far away, where spaceships bore a striking resemblance to these characters joined together.
If you’re not familiar with it, this UFO of Ruby can return -1, 0, or 1. Much like a Jedi determining whether the Force is stronger, balanced, or weaker:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 class Jedi include Comparable attr_accessor :midichlorian_count def initialize(midichlorian_count) @midichlorian_count = midichlorian_count end # Here we define our spaceship operator for custom comparison def <=>(other_jedi) self.midichlorian_count <=> other_jedi.midichlorian_count end end obi_wan = Jedi.new(10000) anakin = Jedi.new(20000) # Compare midichlorian counts using the spaceship operator puts obi_wan <=> anakin # Output: -1 (Obi-Wan has fewer midichlorians) puts anakin <=> obi_wan # Output: 1 (Anakin has more midichlorians) # Check if one Jedi power is greater than the other's using greater than oeprator puts obi_wan > anakin # Output: false (Obi-Wan has fewer midichlorians) puts anakin > obi_wan # Output: true (Anakin has more midichlorians)
Note that though we only implement the
<=> operator, we can still use other comparison operators, such as
==. This is courtesy of the
Comparable module working togeghet with our newest best friend forever, the
<=>, aka “spaceship operator”.
And from now on, every time I encounter that operator, not only will John Williams’ iconic theme echo in my mind, but pixelated spaceships from classic games will zip-zap-buzz around too. As always, the vast universe of Ruby never ceases to astonish. What’s even more curious? I can’t even recall what I used to call this operator before.
Until next time, may the spaceship be with you!