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
.
matriz de gestión de Scala es una plaga .. sólo es posible si está desarrollando en una base congelada – sub
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. –
¿Cómo las implicciones permiten a Array obtener más funcionalidad? –