我正在运行Scala 2.10.2.我想创建一个列表,然后在列表中添加一些元素,并期望在调用列表名称时查看列表中的所有元素.但我观察到一些非常奇怪的东西(因为我是新手,至少对我来说很奇怪).以下是我试图做的事情sbt console
scala> val l = 1.0 :: 5.5 :: Nil
l: List[Double] = List(1.0, 5.5)
scala> l
res0: List[Double] = List(1.0, 5.5)
scala> l ::: List(2.2, 3.7)
res1: List[Double] = List(1.0, 5.5, 2.2, 3.7)
scala> List(l) :+ 2.2
res2: List[Any] = List(List(1.0, 5.5), 2.2)
scala> l
res3: List[Double] = List(1.0, 5.5)
scala>
Run Code Online (Sandbox Code Playgroud)
首先,我创建了l包含2个元素(1.0和5.5)的列表.我打电话l给我所期待的; 这两个要素.现在我尝试在列表中添加另一个元素,使用:::该元素返回一个新列表,其中包含我添加的新元素列表(2.2和3.7)Sweet!我甚至检查了别人的代码以寻求帮助:在Scala的列表末尾添加一个元素以使用新的构造:+.所以在这个阶段我很高兴,但我打电话给l我意外:`res3:List [Double] = List(1.0,5.5)'.
我添加的元素在哪里?我如何正确添加这些元素,以便在我打电话时l获得一个包含我添加的所有内容的新列表?
Ric*_*ver 44
您正在使用不可变列表.List上的操作返回一个新List.旧名单保持不变.如果另一个类/方法持有对原始集合的引用并且依赖于它保持不变,则这非常有用.您可以使用不同的命名val
val myList1 = 1.0 :: 5.5 :: Nil
val myList2 = 2.2 :: 3.7 :: mylist1
Run Code Online (Sandbox Code Playgroud)
或使用var作为
var myList = 1.0 :: 5.5 :: Nil
myList :::= List(2.2, 3.7)
Run Code Online (Sandbox Code Playgroud)
这是等效的语法:
myList = myList.:::(List(2.2, 3.7))
Run Code Online (Sandbox Code Playgroud)
或者您可以使用其中一个可变集合,例如
val myList = scala.collection.mutable.MutableList(1.0, 5.5)
myList.++=(List(2.2, 3.7))
Run Code Online (Sandbox Code Playgroud)
不要与不修改原始可变List的以下内容混淆,但返回一个新值:
myList.++:(List(2.2, 3.7))
Run Code Online (Sandbox Code Playgroud)
但是,您应该只在性能关键代码中使用可变集合.不可变集合更容易推理和使用.一个很大的优点是不可变List和scala.collection.immutable.Vector是Covariant.如果这对您没有任何意义,请不要担心.它的优点是你可以在不完全理解它的情况下使用它.因此,您默认使用的集合实际上是scala.collection.immutable.List,它只是自动为您导入的.
我倾向于使用List作为我的默认集合.从2.12.6 Seq默认为不可变的Seq,在此之前它默认为不可变.
Ant*_*oly 11
如果你真的需要变异,请使用import scala.collection.mutable.MutableList或类似的东西.
import scala.collection.mutable.MutableList
val x = MutableList(1, 2, 3, 4, 5)
x += 6 // MutableList(1, 2, 3, 4, 5, 6)
x ++= MutableList(7, 8, 9) // MutableList(1, 2, 3, 4, 5, 6, 7, 8, 9)
Run Code Online (Sandbox Code Playgroud)
我将尝试解释您尝试的所有命令的结果.
scala> val l = 1.0 :: 5.5 :: Nil
l: List[Double] = List(1.0, 5.5)
Run Code Online (Sandbox Code Playgroud)
首先,List是一个类型别名scala.collection.immutable.List(在Predef.scala中定义).
使用List伴随对象是实例化a的更直接的方法List.例如:List(1.0,5.5)
scala> l
res0: List[Double] = List(1.0, 5.5)
scala> l ::: List(2.2, 3.7)
res1: List[Double] = List(1.0, 5.5, 2.2, 3.7)
Run Code Online (Sandbox Code Playgroud)
::: 返回由给定列表前缀和此列表的串联产生的列表
原始列表未被修改
scala> List(l) :+ 2.2
res2: List[Any] = List(List(1.0, 5.5), 2.2)
Run Code Online (Sandbox Code Playgroud)
List(l)是一种List[List[Double]]绝对不是你想要的.
:+ 返回一个新列表,其中包含此列表的所有元素,后跟elem.
类型是List[Any]因为它是List[Double]和之间的共同超类Double
scala> l
res3: List[Double] = List(1.0, 5.5)
Run Code Online (Sandbox Code Playgroud)
l未经修改,因为没有immutable.List修改List的方法.