scala: действительно ли списки неизменны? - PullRequest
1 голос
/ 13 декабря 2011

В разделе «Программирование в scala» указано, что списки являются неизменяемыми, а массивы изменяемыми.Но я не могу изменить длину массива - и я не могу со списком, так что они оба неизменны.Я могу изменить значение элемента массива - просто установив новое, и я могу изменить значение элемента списка, скажем, методом map.Таким образом, они оба являются изменяемыми.

Так почему же массивы считаются изменяемыми, а списки - нет?

Ответы [ 3 ]

10 голосов
/ 13 декабря 2011

Во-первых, важно знать, что Scala на самом деле имеет как изменяемые, так и неизменные коллекции. Если вы используете scala.collection.mutable.ListBuffer, он (как видно из названия) будет изменчивым. Если вы используете scala.collection.immutable.List, это не будет.

Во-вторых, функция map не изменяет элементы списка, а создает совершенно новый список, содержащий результат функции карты, примененной к каждому элементу стартового списка, например:

var l1 = List(1,3,5)
var l2 = l1.map( _ + 2 )
println(l1) // List(1, 3, 5)
println(l2) // List(2, 4, 6)

l2 теперь содержит новый список, полностью отделенный от l1, и l1 не был изменен.

3 голосов
/ 13 декабря 2011

Вы не можете преобразовать элементы списка - если вы используете функцию, которая преобразует элементы, создается новый список:

scala> val xs = List(1,2,3)
xs: List[Int] = List(1, 2, 3)

scala> xs.map(_+1)
res0: List[Int] = List(2, 3, 4)

scala> xs
res1: List[Int] = List(1, 2, 3)

Напротив, элементы массива изменчивы:

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

scala> xs(0) = 5

scala> xs
res3: Array[Int] = Array(5, 2, 3)

scala> val xs = List(1,2,3)
xs: List[Int] = List(1, 2, 3)

scala> xs(0) = 5
<console>:9: error: value update is not a member of List[Int]
              xs(0) = 5
              ^

Тем не менее вы не можете изменить размер массива.Если вы хотите сделать это, вы должны использовать scala.collection.mutable.Buffer:

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

scala> xs += 4
<console>:9: error: reassignment to val
              xs += 4
                 ^

scala> val xs = collection.mutable.Buffer(1,2,3)
xs: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 3)

scala> xs += 4
res6: xs.type = ArrayBuffer(1, 2, 3, 4)
1 голос
/ 13 декабря 2011

Метод карты списка создаст новый список.

Если вы хотите использовать изменяемые коллекции, см. * scala.collection.mutable package.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...