Question

Dans Ruby Integer === 5 retours true. De même le rendement String === "karthik" true.
Cependant, 5 === Integer retourne false. Et "karthik" === String.
Pourquoi l'opérateur ne commutative?

Était-ce utile?

La solution

La réponse est simple: parce qu'il n'a pas de sens. La relation de l'opérateur décrit n'est pas commutative, pourquoi l'opérateur est?

Il suffit de regarder vos propres exemples: 5 est un Integer. Mais est-Integer un 5? Qu'est-ce que même mean

=== est le cas opérateur subsomption , et subsomption ne commutent pas.

Le fait que l'opérateur subsomption cas utilisations signes égal, et qu'il est généralement appelé égaux triple , opérateur threequals ou case equality est terriblement malheureux car il a non seulement absolument rien à voir avec l'égalité, mais il ne sont pas conformes aussi à plusieurs des lois qui est conforme à l'égalité, comme transitivité et comme vous l'avez mentionné commutativité.

Pour plus de mon rodomontades sur voir de ===

Autres conseils

Une raison très simple est que la relation is_a? pour les classes juste ne peut pas être commutative. Prenons le cas où les deux opérandes sont des classes:

Class === String

Ceci renvoie vrai parce que String.is_a?(Class). Cependant String === Class retourne faux, parce que Class.is_a?(String) est faux et qui est bien sûr, comme il devrait être.

Une autre raison est que la sémantique de === dépend de son opérande gauche. Cela a encore deux raisons: a) En ruby ??la sémantique dépendent toujours de l'opérande gauche, car l'opérande gauche est le récepteur de l'appel de méthode et b) il est utile, de sorte que vous pouvez utiliser par exemple classes, gammes et regexen dans une déclaration de cas avec la sémantique prévus.

De nombreux opérateurs ne sont pas commutative.

Le === est appelé « opérateur d'égalité de cas » parce qu'elle est appelée lorsque la ramification est un cas.

Il est agréable et utile:

foo = 42
case foo
when Integer
  # branches here
when String
  # etc...
end

Il ne serait pas très utile si

foo = Integer
case foo
when 42
# would branch here??
when 666
# etc...
end

Notez que Ruby 1.9, l'opérateur === sur un proc / lambda appellera que Proc:

divisible_by_three = ->(x){x % 3 == 0}
divisible_by_three === 42 # => true

Encore une fois, très utile dans un communiqué de case, mais pas grand-chose dans l'ordre inverse.

il a besoin pour mettre en œuvre au cas où des comparaisons

Il est normal d'avoir des opérateurs non-commutatives.

/ - % [] . -> ^ << >> < <= > >= && || = += -= ,

Et comme il arrive, === existe en partie comme cas lorsque opérateur. C'est assez élaborée en Ruby, et il ne pouvait pas être si elle devait être simplifiée à un op commutative.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top