在Scala中附加到Seq

在Scala中附加到Seq,scala,Scala,下面的代码应该附加到一个Seq,但它打印一个空列表,这里出了什么问题 object AppendToSeq extends App{ val x = Seq[Int]() x :+ 1 x :+ 2 println(x) } 创建的值x是一个不可变序列,在不可变序列上定义的方法:+返回一个新的Seq对象 因此,您的代码应该有x,x有一个var(一个可变变量),并且应该在每次追加(:+)操作后重新赋值,如下所示 scala> var x = Seq[

下面的代码应该附加到一个Seq,但它打印一个空列表,这里出了什么问题

object AppendToSeq extends App{

    val x = Seq[Int]()

    x :+ 1
    x :+ 2

    println(x)

}

创建的值x是一个不可变序列,在不可变序列上定义的方法
:+
返回一个新的Seq对象

因此,您的代码应该有x,x有一个var(一个可变变量),并且应该在每次追加(
:+
)操作后重新赋值,如下所示

scala> var x = Seq[Int]()
x: Seq[Int] = List()

scala> x = x :+ 1
x: Seq[Int] = List(1)

scala> x = x :+ 2
x: Seq[Int] = List(1, 2)

scala> x
res2: Seq[Int] = List(1, 2)

创建的值x是一个不可变序列,在不可变序列上定义的方法
:+
返回一个新的Seq对象

因此,您的代码应该有x,x有一个var(一个可变变量),并且应该在每次追加(
:+
)操作后重新赋值,如下所示

scala> var x = Seq[Int]()
x: Seq[Int] = List()

scala> x = x :+ 1
x: Seq[Int] = List(1)

scala> x = x :+ 2
x: Seq[Int] = List(1, 2)

scala> x
res2: Seq[Int] = List(1, 2)

x:+1
通过将
1
附加到现有的
Seq
x
来创建一个新的
Seq
,但是新的
Seq
没有保存在任何地方,也就是说,它没有分配给任何变量,所以它只是被丢弃了

如果要修改现有的
Seq
,可以将变量设置为
var
,而不是
val
。然后,当您创建一个新的
Seq
时,您可以用相同的名称保存它

scala> var x = Seq[Int]()
x: Seq[Int] = List()

scala> x = x :+ 7
x: Seq[Int] = List(7)

x:+1
通过将
1
附加到现有的
Seq
x
来创建一个新的
Seq
,但是新的
Seq
没有保存在任何地方,也就是说,它没有分配给任何变量,所以它只是被丢弃了

如果要修改现有的
Seq
,可以将变量设置为
var
,而不是
val
。然后,当您创建一个新的
Seq
时,您可以用相同的名称保存它

scala> var x = Seq[Int]()
x: Seq[Int] = List()

scala> x = x :+ 7
x: Seq[Int] = List(7)

scala.collection.Seq
实际上并不保证是不可变的(例如,
ArraySeq
扩展了它)。但是,
:+
从来都不是一个变异方法,而是始终返回一个新的
Seq
对象。
scala.collection.Seq
实际上并不保证是不可变的(例如,
ArraySeq
扩展了它)。然而,
:+
从来都不是一个变异方法,而是总是返回一个新的
Seq
对象。这在Scala中不是一个好的做法。它应该被分配到一个新的
val
这在Scala中不是一个好的做法。应将其分配给新的
val