Die beiden wirklich nichts miteinander zu tun haben. Insbesondere #==
ist der Gleichheitsoperator und #===
hat absolut nichts mit Gleichheit. Ich persönlich finde es ziemlich schade, dass #===
-#==
so ähnlich aussieht, verwendet das Gleichheitszeichen und oft genannt wird die Fall Gleichheitsoperator, triple equals Operator oder threequals Operator, wenn es wirklich nichts mit Gleichheit zu tun hat.
Ich rufe #===
die Fall Subsumption Operator (es ist das beste, was ich könnte kommen, ich bin offen für Vorschläge, vor allem von englischen Muttersprachlern).
Die beste Art zu beschreiben a === b
ist "Wenn ich eine Schublade mit der Bezeichnung a
habe, macht es Sinn, b
drin zu setzen?"
So zum Beispiel, Module#===
testet ob b.is_a?(a)
. Wenn Sie Integer === 2
haben, macht es Sinn, 2
in einem Feld mit der Bezeichnung Integer
zu setzen? Ja tut es. Was ist mit Integer === 'hello'
? Offensichtlich nicht.
Ein anderes Beispiel ist Regexp#===
. Es testet auf eine Übereinstimmung. Ist es sinnvoll, 'hello'
in eine Box mit der Bezeichnung /el+/
einzutragen? Ja tut es.
Für Sammlungen wie Bereiche ist Range#===
als Mitgliedschaftstest definiert: Es macht Sinn, ein Element in ein Feld mit einer Sammlung zu setzen, wenn dieses Element in der Sammlung ist.
Also, das ist, was #===
tut: es testet, ob das Argument unter dem Empfänger subsumiert werden kann.
Was muss das mit case
Ausdrücke? Ganz einfach: in rescue
case foo
when bar
baz
end
ist die gleiche wie
if bar === foo
baz
end
Ich denke, die beste Antwort hier http://StackOverflow.com/a/4467823/5048945 –