3 es igual o operador de caja de Igualdad
-
13-10-2019 - |
Pregunta
En Rubí vuelve Integer === 5
true
. Del mismo modo vuelve String === "karthik"
true
.
Sin embargo, 5 === Integer
vuelve false
. Y "karthik" === String
.
¿Por qué el operador no conmutativa?
Solución
La respuesta es simple: porque no tiene sentido. La relación del operador describe no es conmutativa, ¿por qué debería ser el operador?
Basta con mirar a sus propios ejemplos: 5
es un Integer
. Pero es un Integer
5
? Lo que hace que incluso media
===
es el operador caso subsunción , y la subsunción no significa conmutan.
El hecho de que los usos del operador caso subsunción signos de igualdad, y que por lo general es llamado el triples iguales , threequals
o case equality
funcionamiento es de terriblemente lamentable, ya que no sólo tiene absolutamente nada que ver con la igualdad, pero también no se ajusta a muchas de las leyes que se ajusta a la igualdad, como la transitividad y como usted ha mencionado conmutatividad.
Para más de mi despotricando sobre ===
Ver
Otros consejos
Una razón muy simple es que la relación is_a?
para las clases simplemente no puede ser conmutativa. Considere el caso en que ambos operandos son clases:
Class === String
Esto devolverá cierto porque String.is_a?(Class)
. Sin embargo String === Class
volverá falsa, porque Class.is_a?(String)
es falsa y que es, por supuesto, como debe ser.
Otra razón es que la semántica de ===
depende de su operando izquierdo. Esto tiene de nuevo dos razones: a) En la semántica de rubí siempre dependen del operando de la izquierda, ya que el operando de la izquierda es el receptor de la llamada al método y b) es útil, por lo que puede utilizar, por ejemplo, clases, cocinas y regexen en un comunicado caso de la semántica destinados.
Muchos operadores no son conmutativas.
El ===
se llama el "operador caso de igualdad", ya que se llama cuando ramificación es un caso.
Es agradable y útil que:
foo = 42
case foo
when Integer
# branches here
when String
# etc...
end
No sería muy útil si
foo = Integer
case foo
when 42
# would branch here??
when 666
# etc...
end
Tenga en cuenta que en Ruby 1.9, el operador ===
en un Proc / lambda llamará Proc que:
divisible_by_three = ->(x){x % 3 == 0}
divisible_by_three === 42 # => true
Una vez más, muy útil en un comunicado case
, pero no mucho en el orden inverso.
que necesita para implementar caso cuando las comparaciones
Es normal tener operadores no conmutativos.
/ - % [] . -> ^ << >> < <= > >= && || = += -= ,
Y como sucede, existe ===
, en parte, como el casos y cuando operador. Eso es bastante elaborada en Ruby, y no podría ser lo que si tenía que ser simplificado a una op conmutativa.