Der Threequal Operator

Abgesehen von einfachen Vergleichen mittels == oder eql?, gibt es einen weiteren: Object#=== oder auch Threequal.
Sein Zweck ist es, “Fall Gleichheit” (Case Equality) sicher zu stellen. Die Dokumentation beschreibt es weiterhin mit:

For class Object, effectively the same as calling #==, but typically overridden by descendants to provide meaningful semantics in case statements.

Es ist dazu da, um überschrieben zu werden!
In einigen Klassen wurde das bereits gemacht. Zum Beispiel Range#===:

(1..5) === 3 # => true

Es handelt sich um einen Vergleich zwischen zwei unterschiedlichen Objektenarten, ein Range und ein Fixnum. Kurz gesagt, der Threequal Operator ist technisch gesehen nichts weiter als eine Methode, die einen Parameter erwartet, ähnlich wie == oder +.
Aber dieser ist besonders. Der Threequal wird auch intern aufgerufen, wenn ein case statement versucht zu vergleichen. Noch einmal die Range Klasse, bei der Bewertung eines bestimmten Body Mass Index (BMI):

case 24
  when 0..18
    'Untergewicht'
  when 18..25
    'Normales Gewicht'
  else
    'Adipositas (Übergewicht)'
end # => 'Normales Gewicht'

…Phew.
Bitte beachte, dass der Threequal in der Klasse überschrieben werden muss, die die Vergleichsobjekte aus in dem when-Zweig stellt, nicht in der, die das case statement versucht zu vergleichen.
Also immer, wenn semantische Vergleiche erforderlich sind, macht es absolut Sinn den Object#=== zu überschreiben. Semantische Vergleiche werden damit hervorgehoben.
Ein weiteres Szenario sind Teams, die Mitglieder haben. Die Team Klasse:

class Team
  def initialize *names                                                         
    @members = names                                                            
   end                                                                           

  def === name                                                                  
    @members.include? name                                                      
  end
end

Die Team Threequal Methode prüft, ob der übergebene Name in der Liste der die Teammitglieder enthalten ist. Zwei Teams werden angelegt:

sales = Team.new 'Alice', 'Bob'
development = Team.new 'Chris', 'Deborah'

Angenommen, es gibt keine andere Option, als ein case statement zu verwenden, um zu überprüfen in welchem Team Chris ist, dann würde es vermutlich so aussehen:

case 'Chris'
  when sales then 'Verkauf'
  when development then 'Entwicklung'
  else 'Keins'
end # => "Entwicklung"

Und es wird die richtige Antwort zurückgegeben.