2017-05-16 7 views
0

次のコードはSeqに追加されるはずですが、空のリストを出力します。何が間違っていますか?ScalaのSeqに追加する

object AppendToSeq extends App{ 

    val x = Seq[Int]() 

    x :+ 1 
    x :+ 2 

    println(x) 

} 

答えて

3

値を作成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) 
+0

'scala.collection.Seq'は実際には不変であることは保証されていません(例えば' ArraySeq' extends)。しかし、 ':+'は突然変異するメソッドではありませんが、常に新しい 'Seq'オブジェクトを返します。 –

+0

はい、そうです。この場合、Seqは不変です。 –

1

x :+ 1は、既存のSeqx1を追加することによって、新たなSeqを作成しますが、新しいSeqはつまりは、それが任意の変数に代入されていない、どこにも保存されませんので、それだけで捨てられています。

Seqを変更する場合は、valではなく、変数をvarにすることができます。新しいSeqを作成すると、同じ名前で保存することができます。

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

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