2010-08-02 17 views
9

En Java, == es el tipo de igualdad más fuerte (igualdad de puntero): a == b siempre implica a.equals(b). Sin embargo, en Ruby, == es más débil que .equals?:¿Qué hace == en Ruby?

ruby-1.9.2-rc2 > 17 == 17.0 
=> true 
ruby-1.9.2-rc2 > 17.equal?(17.0) 
=> false 

Entonces, ¿dónde puedo encontrar más información acerca ==? ¿Qué tipo de controles debo esperar cuando comparo dos objetos con él?

Respuesta

8

brevemente esto es lo que necesita saber:

Los == cheques de comparación si dos valores son iguales

eql? comprueba si dos valores son iguales y del mismo tipo

equal? comprueba si dos las cosas son uno y el mismo objeto.

Un buen blog acerca de esto es here.

+2

parece que podrían haber elegido mejores nombres de métodos para eql? e igual? –

+1

CLISP es peor: 'eq',' eql', 'equal',' equalp', y '='. Sin embargo, hay mejores operadores con nombre como 'string-equal' y' tree-equal'. –

+0

OK, ¿entonces nunca debería usar '==' para comparar dos objetos? Pero incluso '5' es un objeto en Ruby ... entonces, ¿qué es seguro usar' == 'para comparar? Cuerdas y números, sin duda. ¿Qué hay de las matrices? Hashes? –

1

en realidad ambos son solo métodos == significa objeto. == (otro_objeto) ¿iguales? significa Object.equals? (other_object)

En este caso, sin embargo, es igual se utiliza básicamente para la comparación de búsqueda de hash es decir a_hash [1] no debería ser el mismo par de valores clave como a_hash [1,0]

HTH. -r

0
jruby-1.5.0 > 17 ==17 
=> true 
jruby-1.5.0 > 17 == 17.0 
=> true 
jruby-1.5.0 > 17 === 17.0 
=> true 
jruby-1.5.0 > 17.equal?(17.0) 
=> false 
jruby-1.5.0 > 17.id 
=> 35 
jruby-1.5.0 > (17.0).id 
(irb):12 warning: Object#id will be deprecated; use Object#object_id 
=> 2114 

Todo en ruby ​​es un objeto. el objeto 17 no es el mismo objeto que 17.0 e igual? compara objetos, no valores de objetos.

1

== es, simplemente, un método. Creo que se explica muy bien here:

Normalmente, este método se reemplaza en clases descendientes para proporcionar significado específico de clase.

junto con un ejemplo con Numeric s.

Hay un escollo, sin embargo: como == es un método del operando de la izquierda, que no siempre es seguro asumir que el resultado de a==b debe ser el mismo que el de b==a. Especialmente en los casos en que a es una llamada a método, que, en un lenguaje dinámico como Ruby, no siempre debe devolver valores del mismo tipo.