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)
Почему эти два выражения имеют другую семантику?
Это немного сбивает с толку, но в Scala есть понятие классов , экземпляры которых вы можете создавать, и объектов , которые по сути являются одноэлементными экземплярами класса. Он также имеет понятие сопутствующих классов , которое представляет собой пару класса и объекта с тем же именем. Этот механизм позволяет «классу» иметь статические методы, которые иначе в Scala невозможны.
Массив
содержит как класс , так и сопутствующий объект . Кроме того, объект Array
имеет метод apply
. apply
означает, что вы можете создать объект с помощью Array (arg)
. Но поскольку Array
является сопутствующим классом, у него также есть конструктор, который можно вызвать с помощью более обычного механизма new Array (arg)
.
Проблема в том, что apply
в объекте Array
имеет другую семантику, чем конструкторы Array
.Метод apply
создает массив из указанных объектов, поэтому, например, Array (1,2,3)
возвращает массив, состоящий из объектов 1
, 2
и 3
. Конструкторы, с другой стороны, принимают аргументы, которые определяют размер измерений массива (так что вы можете создавать многомерные массивы), а затем инициализируют все слоты значением по умолчанию.
Итак, в основном:
val a = Array [Double] (10)
вызывает метод apply
для объекта Array
, который создает новый массив, содержащий данные объекты. val a = new Array [Double] (10)
вызывает конструктор Array
, который создает новый массив с 10 слотами, все инициализируются значением по умолчанию 0,0
. new Array [Double] (10)
должен быть эквивалентен new double [10]
в Java.
Но Scala также предоставляет удобные методы для синглтонов, соответствующих его классам коллекций, и Array
не является исключением.
Таким образом, если вы можете сказать List (1,2,3,4,5)
, кажется естественным, что вы также можете сказать Array (1,2,3,4,5)
. А ты можешь.
Но это оставляет одного в несколько неудобном положении, так как результаты могут отличаться в зависимости от того, добавлено ли слово новый
или нет. Учитывая конкурирующие интересы, я думаю, что это лучшее решение в целом, но к нему нужно немного привыкнуть.