2010-03-19 13 views
24

Por lo que yo entiendo, Scala == define la igualdad natural de dos objetos.¿Por qué `Array (0,1,2) == Array (0,1,2)` no devuelve el resultado esperado?

esperaba que Array(0,1,2) == Array(0,1,2) comparara la igualdad natural. Por ejemplo, comprueba si todos los elementos de la matriz devuelven verdadero cuando se compara con los elementos correspondientes de la otra matriz.

La gente me dijo que el Array de Scala es solo un Java [] que solo compara la identidad. ¿No sería más significativo anular el método Array de equals para comparar la igualdad natural en su lugar?

+0

No estoy familiarizado con Scala. Sin embargo, ¿está seguro de que == no está comparando si las matrices son alias (referencias al mismo objeto en la memoria)? Supongo que esta es una posibilidad, ya que mencionó que está relacionado con una matriz de Java. – Cam

+1

Es una situación desafortunada, como las otras respuestas describen, pero cuando sabes que estás tratando con Array, puedes usar sameElements y obtener la respuesta que deseas mientras evitas todo el envoltorio, el boxeo y las circunlocuciones. –

Respuesta

19

Scala 2.7 intentó agregar funcionalidad a las matrices Java [], y se encontró con casos de esquina problemáticos. Scala 2.8 ha declarado que Array[T] es T[], pero proporciona envoltorios y equivalentes.

intente lo siguiente en 2.8 (edición/nota: a partir del RC3, GenericArray es ArraySeq --Gracias a retronym por señalar esto):

import scala.collection.mutable.{GenericArray=>GArray, WrappedArray=>WArray} 
scala> GArray(0,1,2) == GArray(0,1,2) 
res0: Boolean = true 

scala> (Array(0,1,2):WArray[Int]) == (Array(0,1,2):WArray[Int]) 
res1: Boolean = true 

GenericArray actúa igual que Array, excepto con toda la Scala colecciones buenas añadidas en. WrappedArray envuelve Java [] matriz; más arriba, le eché una matriz simple (más fácil que llamar a la función de conversión implícita) y luego comparé las matrices envueltas. Estas envolturas, aunque respaldadas por una matriz [], también le brindan todos los objetos de colección.

+0

¿Hay algún rendimiento/memoria/tipado/... beneficios del uso de estas clases en lugar de e. gramo. una lista entonces? Me imagino que GenericArray/WrappedArray agrega un poco de sobrecarga ... – soc

+1

No, de hecho, agregan muy poca sobrecarga - 'WrappedArray' es una clase extra envuelta alrededor de una matriz Java simple. 'List' requiere una clase extra alrededor de cada elemento. Usas listas debido a la facilidad de uso y la combinación e inmutabilidad de patrones interesantes, no por eficiencia. 'GenericArray' tiene una posición ligeramente extraña, sin embargo, como una matriz de tamaño fijo: el tamaño es inmutable pero los contenidos son mutables.¿Por qué, uno podría preguntarse, no solo usar un 'ArrayBuffer'? –

+1

Puede usar una lista inmutable debido al rendimiento. Las colecciones inmutables pueden salvarlo de tener que hacer copias defensivas. Dependiendo de la aplicación, esto puede superar su sobrecarga. – ziggystar

5

Pero cadena de Scala también es sólo una cadena de Java pero anula Scala es igual a comparar igualdad natural.

Scala no anula nada allí; java.lang.String tiene una implementación dependiente del valor de equals() (como muchas otras clases de Java, pero a diferencia de las matrices).

+0

Hola Michael, gracias! Arreglé mi pregunta en consecuencia. Básicamente me pregunto por qué igual no se anula para devolver la igualdad natural como las clases de Colección (¡sé que Array no pertenece a las clases de Colección!). – soc

+3

Scala interpreta '==' como 'igual'. Eso es todo. 'String' tiene un' igual' que hace algo útilmente diferente de la identidad de referencia. '[]' no. –

8

Scala no anula la igualdad de Array porque no es posible. Uno solo puede anular los métodos al crear subclases. Como Array no está siendo subclasificado (lo cual no es posible), Scala no puede anular sus métodos.

Cuestiones relacionadas