2016-02-18 13 views
7

ほんの少し前に、私はPaul Philipの要点https://gist.github.com/paulp/9085746が見つかりました。私は、任意の説明を見つけることができませんでした どのようにしている可能性がscala可変値リスト

簡略化されたコードスニペット:

そこで何が起こっているのか toIterable

val buf = new ListBuffer[Int]() 
buf ++= Seq(1,2,3) 
val lst: List[Int] = buf.toList 
println(lst) //List(1,2,3) 
buf ++= Seq(4,5,6) 
println(lst) //List(1,2,3) 

せずに期待どおりに動作します

val buf = new ListBuffer[Int]() 
buf ++= Seq(1,2,3) 
val lst: List[Int] = buf.toIterable.toList 
println(lst) //List(1,2,3) 
buf ++= Seq(4,5,6) 
println(lst) //List(1,2,3,4,5,6) 

答えて

6

あなたはList sourceを見てみましょう場合、あなたは短所が::クラスがその尾がprivate[scala] var tlないvalとして定義されていることがわかりますので、それは内部的に変更可能です。

exportedフラグがセットされていない限り、この突然変異はduring ListBuffer appendである。

このフラグはSeqForwarderから継承されているのと同じList

しかしtoIterableの更なる変形を防止the toList methodに設定されている - そのようなことについての知識を持たない>IterableForwarder、同じstartオブジェクトを返すas it used as underlying value

+0

これはバグですよね?私は、この動作が実際には意図されていないということを意味します... – Dima

+0

@Dima私はそれがバグだと思っています – Odomontois

+0

実際には 'append'だけではないようです:例えば' buf - = 3'は '最初 – Dima

関連する問題