几天前,我发现保罗·菲利普(Paul Philip)的要点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)
那里发生了什么事?
最佳答案
如果查看 List
source,您会看到cons ::
类的尾部定义为private[scala] var tl
而不是val
,因此它在内部是可变的。
除非设置了ListBuffer
标志,否则此突变正在during exported
append中发生。
在the toList
method中设置此标志,以防止进一步修改相同的List
但是toIterable
继承自SeqForwarder
-> IterableForwarder
,后者对此一无所知,但返回的是相同的start
对象as it used as underlying
value
关于list - 标量可变值列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35491233/