Ser*_*ruk 7 scala list 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)
Run Code Online (Sandbox Code Playgroud)
它没有预期的工作 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)
Run Code Online (Sandbox Code Playgroud)
那里发生了什么?
如果您查看List源代码,您会看到cons ::类的尾部定义为private[scala] var tlnot val,因此它在内部是可变的.
除非设置了标志,否则在ListBuffer附加期间会发生此突变exported.
在该toList方法中设置该标志,防止进一步修改该标志List
但是toIterable继承自SeqForwarder- > IterableForwarder,它不知道这样的事情,但返回与用作 值的相同start对象underlying
| 归档时间: |
|
| 查看次数: |
96 次 |
| 最近记录: |