Неизменность коллекции скала - PullRequest
0 голосов
/ 04 мая 2018

В неизменяемой коллекции в Scala новый объект создается при изменении длины коллекции. Давайте предположим, что я создаю неизменный массив и затем выполняю конкатенацию:

object Dcoder extends App
{
    var array=Array("abc","xyz")
    var change =array++Array("change of object")
}

Создается ли новый объект из-за ++? Поскольку я использую неизменяемую коллекцию, а ее длина изменилась, вызвано ли изменение объекта созданием?

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

как указано в документации по массиву

def ++ [B>: A, That] (что: GenTraversableOnce [B]) (неявное bf: CanBuildFrom [Array [T], B, That]): То

Возвращает новую изменяемую индексированную последовательность, содержащую элементы из левого операнда, за которыми следуют элементы из правого операнда.

Возвращает новый объект. Кстати, что-то не понятно: хранится ли ссылка на элементы в предыдущем объекте или нет? Для проверки мы можем просто попробовать:

scala> val array = Array(1,2)
array: Array[Int] = Array(1, 2)

scala> val array2 = array ++ Array(3)
array2: Array[Int] = Array(1, 2, 3)

scala> array.update(0, 10)
array.update(0, 10)

scala> array
array
res2: Array[Int] = Array(10, 2)

scala> array2
array2
res3: Array[Int] = Array(1, 2, 3)

Так что это не ссылка на старые значения, а просто их копирование, и это имеет смысл, поскольку это изменчивая коллекция.

0 голосов
/ 04 мая 2018

Вы просто вызываете метод ++ для вашего объекта Array (документация https://www.scala -lang.org / api / current / scala / Array.html ) с использованием инфиксной записи (https://docs.scala -lang.org / стиль / метод-invocation.html )

...