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

Warum diese beiden Ausdrücke haben unterschiedliche Semantik?Scala Array Konstruktor?

+0

Array in Scala Verwaltung ist ein Schädling .. nur möglich, wenn Sie auf einem gefrorenen Basis – sub

+3

A entwickeln „vereiste?“ Die Array-Behandlung hat sich von 2,7 auf 2,8 deutlich geändert, aber ich denke, wir können davon ausgehen, dass sie im weiteren Verlauf stabil bleibt. Jetzt ist Scala Array Java Array. Die "Extra" -Array-Funktionalität von Scala wird über Implicits gehandhabt. –

+0

Wie ermöglichen die implicts Array mehr Funktionalität zu bekommen? –

Antwort

42

Es ist ein wenig verwirrend, aber Scala hat den Begriff der Klassen, die Sie Instanzen und Objekte erstellen können, die im Grunde Singleton Instanzen einer Klasse sind. Es hat auch den Begriff der Begleiter Klassen, die ein Paar einer Klasse und ein Objekt mit dem gleichen Namen. Dieser Mechanismus erlaubt einer "Klasse" im Wesentlichen statische Methoden zu haben, die in Scala sonst nicht möglich sind.

Array hat sowohl eine Klasse und ein Begleiter Objekt. Ferner hat die Array object eine apply Methode. apply bedeutet, dass Sie ein Objekt mit Array(arg) erstellen können. Aber weil Array ein Begleiter Klasse ist, hat es auch einen Konstruktor, der über den üblichen Mechanismus der new Array(arg) aufgerufen werden kann.

Das Problem ist, dass apply in der Array Objekt hat andere Semantik als die Array Konstruktoren. Die apply Verfahren erzeugt ein Array aus den angegebenen Objekte, so zum Beispiel Array(1,2,3) ein Array zurückgibt, bestehend aus den Objekten 1, 2 und 3. Die Konstruktoren, andererseits nehmen Argumente, die die Größe der Dimensionen des Arrays angeben (so können Sie mehrdimensionalen Arrays erstellen), und dann alle Steckplätze auf einen Standardwert initialisieren.

Also, im Grunde:

  • val a = Array [Double] (10) ruft die Methode auf dem applyArray Objekt, das ein neues Array erzeugt die gegebenen Objekte enthält.
  • val a = new Array [Double] (10) ruft den Konstruktor Array auf, der ein neues Array mit 10 Steckplätzen erstellt, die alle auf einen Standardwert von 0.0 initialisiert sind.
+0

Große Antwort. Vielen Dank! –

+0

@mipadi, wie ein neues Array mit 10 Steckplätzen und 1 als Standardwert erstellen? Danke – city

+0

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

10

new Array[Double](10) soll in Java gleich new double[10] sein.

Aber Scala bietet auch bequeme Methoden für die Singletons zu seiner Sammlung Klassen entsprechen, und Array ist keine Ausnahme. Wenn Sie List(1,2,3,4,5) sagen können, scheint es natürlich, dass Sie auch Array(1,2,3,4,5) sagen könnten. Und du kannst.

Aber es macht man in der etwas ungünstigen Position verlassen recht unterschiedliche Ergebnisse, die davon abhängt, ob man das Wort new oder nicht hinzufügt. Angesichts der konkurrierenden Interessen, denke ich, es ist die beste Lösung insgesamt, aber es ist etwas gewöhnungsbedürftig.

Verwandte Themen