Die beiden haben wirklich nichts miteinander zu tun. Insbesondere #==
ist der Gleichheitsoperator und #===
hat absolut nichts mit Gleichheit zu tun. Ich persönlich finde es sehr schade , dass #===
sieht so ähnlich , #==
verwendet das Gleichheitszeichen und oft wird die gerufene Fall Gleichheitsoperator , triple equals Operator oder threequals Operator , wenn es wirklich nichts mit Gleichheit zu tun hat.
Ich rufe #===
den Fall-Subsumtions-Operator an (es ist das Beste, was ich mir vorstellen kann, ich bin offen für Vorschläge, insbesondere von englischen Muttersprachlern).
Die beste Art zu beschreiben a === b
ist: "Wenn ich eine Schublade beschriftet habe a
, ist es sinnvoll, sie b
einzulegen?"
So wird zum Beispiel Module#===
getestet, ob b.is_a?(a)
. Wenn ja Integer === 2
, ist es sinnvoll, 2
eine Box mit der Aufschrift zu verwenden Integer
? Ja tut es. Was ist mit Integer === 'hello'
? Offensichtlich nicht.
Ein anderes Beispiel ist Regexp#===
. Es testet auf ein Match. Ist es sinnvoll, 'hello'
eine beschriftete Box einzulegen /el+/
? Ja tut es.
Für Sammlungen wie Bereiche Range#===
wird dies als Mitgliedschaftstest definiert: Es ist sinnvoll, ein Element in ein Feld mit einer Sammlung einzufügen, wenn sich dieses Element in der Sammlung befindet.
Das ist es also, was es #===
tut: Es testet, ob das Argument unter dem Empfänger zusammengefasst werden kann.
Was hat das mit case
Ausdrücken zu tun? Einfach:
case foo
when bar
baz
end
ist das gleiche wie
if bar === foo
baz
end