3 entspricht oder Fallgleichheitsoperator
-
13-10-2019 - |
Frage
In Ruby Integer === 5
kehrt true
. Ähnlich String === "karthik"
kehrt true
.
Allerdings gibt 5 === Integer
false
. Und "karthik" === String
.
Warum ist der Betreiber nicht kommutativ?
Lösung
Die einfache Antwort ist: weil es keinen Sinn macht. Die Beziehung der Bediener beschreibt, ist nicht kommutativ, warum sollte der Betreiber sein?
Just Blick auf Ihre eigenen Beispiele: 5
ist ein Integer
. Aber ist Integer
ein 5
? Was bedeutet, dass auch mittlere
===
ist der Fall Subsumtion Operator und Subsumtion pendelt nicht.
Die Tatsache, dass der Fall Subsumtion Operator verwendet Gleichheitszeichen, und dass es in der Regel heißt das triple equals , threequals
oder case equality
Operator schrecklich bedauerlich, da es nicht nur absolut nichts mit Gleichheit zu tun, aber es entspricht auch nicht zu viele der Gesetze, die Gleichheit Konform, wie Transitivität und wie Sie commutativity erwähnt.
Für mehr meinen Schimpfen über ===
siehe
Andere Tipps
Ein sehr einfacher Grund dafür ist, dass die is_a?
Beziehung für die Klassen einfach nicht kommutativ. Betrachten wir den Fall, wo beide Operanden Klassen:
Class === String
Dies wird return true, weil String.is_a?(Class)
. Allerdings String === Class
wird false zurück, weil Class.is_a?(String)
falsch ist, und das ist natürlich, wie es sein sollte.
Ein weiterer Grund ist, dass die Semantik von ===
auf seinen linken Operanden abhängt. Dies wiederum hat zwei Gründe: a) in Ruby die Semantik hängen immer von der linken Operanden, weil der linke Operand der Empfänger des Methodenaufrufs ist und b) ist es sinnvoll, so dass Sie beispielsweise verwenden können Klassen, Bereiche und in einem Fall Aussage mit der beabsichtigten Semantik.
Viele Betreiber sind nicht kommutativ.
Die ===
ist der „Fall Gleichheitsoperator“ genannt, weil es genannt wird, wenn es ein Fall, Verzweigung.
Es ist schön und nützlich, dass:
foo = 42
case foo
when Integer
# branches here
when String
# etc...
end
Es wäre nicht sehr sinnvoll, wenn
foo = Integer
case foo
when 42
# would branch here??
when 666
# etc...
end
Beachten Sie, dass in Ruby 1.9, der ===
Operator auf einem Proc / Lambda ruft, dass Proc:
divisible_by_three = ->(x){x % 3 == 0}
divisible_by_three === 42 # => true
Wieder sehr nützlich in einer case
Aussage, aber nicht viel in der umgekehrten Reihenfolge.
braucht es fall wenn Vergleiche
zu implementierenEs ist normal nichtkommutative Betreiber zu haben.
/ - % [] . -> ^ << >> < <= > >= && || = += -= ,
Und wie es geschieht, existiert ===
teilweise als Fall wenn Operator. Das ist ziemlich in Ruby erarbeiten, und es kann nicht so sein, wenn es zu einem kommutativen op vereinfacht werden muß.