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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top