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?

War es hilfreich?

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.

regexen

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 implementieren

Es 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ß.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top