Почему Массив единиц может содержать ноль? - PullRequest
3 голосов
/ 02 мая 2011

Unit определено как подтип AnyVal (и его единственное значение ()), так почему это возможно:

scala> val units = new Array[Unit](5)
units: Array[Unit] = Array(null, null, null, null, null)

Это просто ошибка / упущение в механизме печати массива REPL или есть причина для этого?

Ответы [ 3 ]

3 голосов
/ 02 мая 2011

Предполагается, что нулевое значение должно появляться только в этом строковом представлении.Как только вы получаете значение из массива, оно «распаковывается» в Unit:

scala> val units = new Array[Unit](5)
units: Array[Unit] = Array(null, null, null, null, null)

scala> units(0)
// note: no result

Сравните с:

scala> val refs = new Array[AnyRef](5)
refs: Array[AnyRef] = Array(null, null, null, null, null)

scala> refs(0)                        
res0: AnyRef = null // we do get the null here

Аналогичное обсуждение было в этот вопрос с Nothing вместо Unit.

3 голосов
/ 02 мая 2011

Я думаю, что это проблема / ограничение с инициализацией массива.Для примитивных значений массивы инициализируются до их значения по умолчанию, которое я предполагаю JVM благодаря массивам Scala, использующим собственные массивы.

Для других типов значение будет заключено в объект, кажется, что они инициализируются как нулевые.

Если вам нужен массив единиц, вам может потребоваться вызвать val units = Array.fill(5)(()).

1 голос
/ 12 мая 2011

Это было исправлено для Scala 2.9 и теперь печатает:

scala> val units = new Array[Unit](5)
units: Array[Unit] = Array((), (), (), (), ())
...