【问题标题】:scala: are lists really immutable?scala:列表真的不可变吗?
【发布时间】:2011-12-12 20:41:05
【问题描述】:

在“Scala 编程”中指出,列表是不可变的,而数组是可变的。但是我不能改变数组长度——我也不能用列表,所以这样它们都是不可变的。我可以更改数组的元素值——只需设置一个新值,我可以使用 map 方法修改列表的元素值。所以通过这种方式,它们都是可变的。

那么为什么数组被认为是可变的而列表不是呢?

【问题讨论】:

    标签: arrays list scala


    【解决方案1】:

    首先,重要的是要知道 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
    【解决方案2】:

    您无法转换 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)
    

    【讨论】:

      【解决方案3】:

      List 的 map 方法会创建一个新的列表。

      如果您想使用可变集合,请参阅 * scala.collection.mutable 包。

      【讨论】:

        猜你喜欢
        • 2015-12-14
        • 2015-12-16
        • 1970-01-01
        • 2016-05-31
        • 2013-04-10
        • 1970-01-01
        • 2018-07-19
        • 2015-07-10
        • 1970-01-01
        相关资源
        最近更新 更多