【发布时间】:2011-12-12 20:41:05
【问题描述】:
在“Scala 编程”中指出,列表是不可变的,而数组是可变的。但是我不能改变数组长度——我也不能用列表,所以这样它们都是不可变的。我可以更改数组的元素值——只需设置一个新值,我可以使用 map 方法修改列表的元素值。所以通过这种方式,它们都是可变的。
那么为什么数组被认为是可变的而列表不是呢?
【问题讨论】:
在“Scala 编程”中指出,列表是不可变的,而数组是可变的。但是我不能改变数组长度——我也不能用列表,所以这样它们都是不可变的。我可以更改数组的元素值——只需设置一个新值,我可以使用 map 方法修改列表的元素值。所以通过这种方式,它们都是可变的。
那么为什么数组被认为是可变的而列表不是呢?
【问题讨论】:
首先,重要的是要知道 Scala 实际上既有可变集合也有不可变集合。如果您使用scala.collection.mutable.ListBuffer,它将(如名称所示)是可变的。如果您使用scala.collection.immutable.List,则不会。
其次,map 函数不会改变列表的元素,而是创建一个全新的列表,其中包含应用于开始列表的每个元素的 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 没有更改。
【讨论】:
scala.collection.mutable.List。
您无法转换 List 的元素 - 如果您使用转换元素的函数,则会创建一个新 List:
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)
相比之下,Array 的元素是可变的:
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)
【讨论】:
List 的 map 方法会创建一个新的列表。
如果您想使用可变集合,请参阅 * scala.collection.mutable 包。
【讨论】: