2010-04-23 18 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) 

Perché queste due espressioni hanno semantica diversa?Costruttore di Scala Array?

+0

La gestione di array in Scala è una piaga .. possibile solo se si sviluppa su una base congelata – sub

+3

Una "base congelata?" Il vero trattamento di array è cambiato considerevolmente da 2,7 a 2,8, ma penso che possiamo aspettarci che rimanga stabile in futuro. Ora Scala Array è Java Array. La funzionalità di matrice "extra" di Scala viene gestita tramite impliciti. –

+0

In che modo gli impliciti consentono a Array di ottenere più funzionalità? –

risposta

42

E 'un po' di confusione, ma alla Scala ha la nozione di classi cui è possibile creare istanze di oggetti, e , che sono fondamentalmente le istanze di una classe Singleton. Ha anche la nozione di classi companion, che è una coppia di una classe e un oggetto con lo stesso nome. Questo meccanismo consente ad una "classe" di avere essenzialmente metodi statici, che altrimenti non sarebbero possibili in Scala.

Array ha sia una classe e un oggetto compagna . Inoltre, lo Array object ha un metodo apply. apply significa che è possibile creare un oggetto con Array(arg). Ma poiché Array è una classe companion, ha anche un costruttore che può essere chiamato tramite il meccanismo più comune di new Array(arg).

Il problema è chenell'oggetto Array ha una semantica diversa rispetto ai costruttori Array. Il metodo apply crea una matrice dagli oggetti specificati, pertanto, ad esempio, Array(1,2,3) restituisce una matrice costituita dagli oggetti 1, 2 e 3. I costruttori, d'altro canto, accettano argomenti che specificano la dimensione delle dimensioni dell'array (in modo da poter creare matrici multidimensionali), e quindi inizializzare tutti gli slot su un valore predefinito.

Quindi, in sostanza:

  • val a = Array [Double] (10) chiama il metodo apply sull'oggettoArray, che crea un nuovo array contenente gli oggetti dati.
  • val a = new Array [Double] (10) chiama il costruttore Array, che crea un nuovo array con 10 slot, il tutto inizializzato su un valore predefinito di 0.0.
+0

Ottima risposta. Grazie! –

+0

@mipadi, come creare un nuovo array con 10 slot e 1 come valore predefinito? Grazie – city

+0

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

10

new Array[Double](10) equivale a new double[10] in Java.

Ma Scala fornisce anche metodi di convenienza sui singleton corrispondenti alle sue classi di raccolta e Array non fa eccezione.

Quindi, se si può dire List(1,2,3,4,5) sembra naturale che si possa anche dire Array(1,2,3,4,5). E tu puoi.

Ma lascia uno nella posizione leggermente scomoda di avere risultati piuttosto diversi a seconda se si aggiunge la parola new oppure no. Considerati gli interessi in competizione, penso che sia la soluzione migliore in generale, ma ci vuole un po 'per abituarsi.