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

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)

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

16
задан Łukasz Lew 23 April 2010 в 16:17
поделиться

2 ответа

Это немного сбивает с толку, но в 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 .
43
ответ дан 30 November 2019 в 15:30
поделиться

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

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

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

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

11
ответ дан 30 November 2019 в 15:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: