Scala Array конструктор? - PullRequest
       6

Scala Array конструктор?

16 голосов
/ 23 апреля 2010
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)

Почему эти два выражения имеют разную семантику?

Ответы [ 2 ]

43 голосов
/ 23 апреля 2010

Это немного сбивает с толку, но в Scala есть понятие классы , для которых вы можете создавать экземпляры, и объекты , которые в основном являются единичными экземплярами класса. Он также имеет понятие классов-компаньонов , представляющих собой пару класса и объекта с одинаковым именем. Этот механизм позволяет «классу» по существу иметь статические методы, которые в Scala невозможны.

Array имеет класс и сопутствующий объект . Кроме того, 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.
11 голосов
/ 23 апреля 2010

new Array[Double](10) должен быть эквивалентен new double[10] в Java.

Но Scala также предоставляет удобные методы для синглетонов, соответствующих классам своей коллекции, и Array не является исключением.

Таким образом, если вы можете сказать List(1,2,3,4,5), то вполне естественно, что вы могли бы также сказать Array(1,2,3,4,5). И вы можете.

Но это действительно оставляет человека в слегка неловком положении с довольно разными результатами в зависимости от того, добавляет ли он слово new или нет. Учитывая конкурирующие интересы, я думаю, что это лучшее решение в целом, но для этого нужно немного привыкнуть.

...