2010-07-01 13 views
13

¿Cuál es la diferencia entre == y ===? ¿Cuál deberías usar cuando?Operadores de comparación Ruby? == vs. ===

+0

Hay una muy sólida Responda a esto en [¿Cuál es la diferencia entre equal ?, eql ?, === y ==?] (http://stackoverflow.com/questions/7156955/whats-the-difference-between-equal-eql-and) –

Respuesta

0

== se utiliza para la igualdad en las sentencias condicionales como if, unless, etc. === se utiliza para determinar la igualdad en case declaraciones.

+3

Como ejemplo, 10 no es igual a 1..20, pero está dentro de ese rango. Por lo que es posible que desee poner el rango en su declaración de caso y hacer que se seleccione. Además, tenga en cuenta que las sentencias de caso se traducen en b === a en sentencias como 'case a when b then true end' –

22

Ambos son solo métodos llamados objetos. Esto significa que los objetos deciden qué significa qué. Sin embargo, hay convenciones en Ruby sobre cómo son diferentes. Por lo general, == es más estricto que === - a === b casi es siempre cierto si a == b es. El mejor lugar para leer sobre esto es http://ruby-doc.org/core/classes/Object.html. Desplácese hacia abajo a las diferentes secciones sobre == y ===. Estas son algunas de las convenciones que conozco:

  • ==, cuando se aplica a la llanura Object s, sólo será verdadera si uno es exactamente el mismo que el otro - si están almacenados en la ubicación misma memoria (esto es cómo funciona Ruby internamente). Sin embargo, si los argumentos son de tipos distintos de Object, este método será anulado.
  • equal? es como == para plain Object s, pero no será reemplazado por subclases.
  • === se utiliza para:
    • una alternativa is_a?, hacia atrás. String === 'str' es cierto.
    • correspondencias recíprocas. /s[at]r*/ === 'str' es cierto.

puede encontrar el significado específico de === para diversas clases en la documentación de esas clases, por ejemplo, la versión Range es aquí (sinónimo de include?): http://ruby-doc.org/core/classes/Range.html#M000691

+1

Un buen ejemplo de anulación' == 'para que haga lo que (probablemente) espera sean cadenas. Compare '==' y '.equal' para un literal de cadena y una variable que apunta a la" misma "cadena. – Telemachus

Cuestiones relacionadas