次のコードはSeqに追加されるはずですが、空のリストを出力します。何が間違っていますか?ScalaのSeqに追加する
object AppendToSeq extends App{
val x = Seq[Int]()
x :+ 1
x :+ 2
println(x)
}
次のコードはSeqに追加されるはずですが、空のリストを出力します。何が間違っていますか?ScalaのSeqに追加する
object AppendToSeq extends App{
val x = Seq[Int]()
x :+ 1
x :+ 2
println(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
は、既存のSeq
、x
に1
を追加することによって、新たなSeq
を作成しますが、新しいSeq
はつまりは、それが任意の変数に代入されていない、どこにも保存されませんので、それだけで捨てられています。
Seq
を変更する場合は、val
ではなく、変数をvar
にすることができます。新しいSeq
を作成すると、同じ名前で保存することができます。
scala> var x = Seq[Int]()
x: Seq[Int] = List()
scala> x = x :+ 7
x: Seq[Int] = List(7)
'scala.collection.Seq'は実際には不変であることは保証されていません(例えば' ArraySeq' extends)。しかし、 ':+'は突然変異するメソッドではありませんが、常に新しい 'Seq'オブジェクトを返します。 –
はい、そうです。この場合、Seqは不変です。 –