2010-04-23 11 views
16
scala> val a = Array [Double] (10) 
a: Array[Double] = Array(10.0) 

scala> val a = new Array [Double] (10) 
a: Array[Double] = Array(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) 

¿Por qué estas dos expresiones tienen una semántica diferente?Scala Array constructor?

+0

matriz de gestión de Scala es una plaga .. sólo es posible si está desarrollando en una base congelada – sub

+3

una "base congelada?" Su verdadero tratamiento de matriz cambió considerablemente de 2.7 a 2.8, pero creo que podemos esperar que se mantenga estable en lo sucesivo. Ahora Scala Array es Java Array. La funcionalidad de matriz "extra" de Scala se maneja a través de implicits. –

+0

¿Cómo las implicciones permiten a Array obtener más funcionalidad? –

Respuesta

42

Es un poco confuso, pero Scala tiene la noción de clases que puede crear instancias de objetos, y , que son básicamente los casos simples de una clase. También tiene la noción de clases complementarias, que es un par de una clase y un objeto con el mismo nombre. Este mecanismo permite que una "clase" tenga esencialmente métodos estáticos, que de otro modo no serían posibles en Scala.

Array tiene tanto una clase y un objeto acompañante . Además, el Array object tiene un método apply. apply significa que puede crear un objeto con Array(arg). Pero debido a que Array es una clase compañera, también tiene un constructor que se puede llamar a través del mecanismo más habitual de new Array(arg).

El problema es que apply en el objeto Array tiene una semántica diferente a la de los constructores Array. El método apply crea una matriz fuera de los objetos especificados, por lo que, por ejemplo, Array(1,2,3) devuelve una matriz que consiste en los objetos 1, 2, y 3. Los constructores, por otro lado, toman argumentos que especifican el tamaño de las dimensiones de la matriz (para que pueda crear matrices multidimensionales), y luego inicializan todas las ranuras a un valor predeterminado.

Así que, básicamente:

  • val a = Array [Double] (10) llama al método apply en el Array objeto, lo que crea una nueva matriz que contiene los objetos dados.
  • val a = new Array [Double] (10) llama al constructor Array, que crea una nueva matriz con 10 ranuras, todas inicializadas a un valor predeterminado de 0.0.
+0

Gran respuesta. ¡Gracias! –

+0

@mipadi, ¿cómo crear una nueva matriz con 10 ranuras y 1 como valor predeterminado? Gracias – city

+0

@city 'val a = Array.fill (10) {1}' –

10

new Array[Double](10) se supone que es equivalente a new double[10] en Java.

Pero Scala también proporciona métodos de conveniencia en los embarazos únicos que corresponden a sus clases de colección, y Array no es una excepción.

Por lo tanto, si puede decir List(1,2,3,4,5) parece natural que usted también podría decir Array(1,2,3,4,5). Y tu puedes.

Pero deja uno en la posición ligeramente incómoda de tener lugar diferentes resultados dependiendo de si se añade la palabra new o no. Teniendo en cuenta los intereses en conflicto, creo que es la mejor solución en general, pero lleva un tiempo acostumbrarse.

Cuestiones relacionadas