scala mutable val List

时间:2016-02-18 19:58:22

标签: list scala immutability mutability

几天前,我发现保罗菲利普的主旨https://gist.github.com/paulp/9085746显示出相当奇怪的行为。 我没有找到任何解释如何可能

简化代码段:

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)

没有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)

那里发生了什么?

1 个答案:

答案 0 :(得分:6)

如果您查看List source,您会看到cons ::类的尾部定义为private[scala] var tl而不是val,因此它在内部是可变的。

除非设置exported标志,否则此突变发生during ListBuffer append

此标志在the toList method中设置,阻止进一步修改同一List

toIterable继承自SeqForwarder - > IterableForwarder,它不了解此类内容,但正在返回相同的start对象as it used as underlying value