【问题标题】:scala mutable val Listscala 可变 val 列表
【发布时间】:2016-05-31 04:41:36
【问题描述】:

几天前,我发现了 Paul Philip 的 gist https://gist.github.com/paulp/9085746,它表现出非常奇怪的行为。 我没有找到任何解释怎么可能

简化代码sn-p:

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 scala immutability mutability


    【解决方案1】:

    如果您查看 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

    【讨论】:

    • @Dima 我相信这是一个错误
    • 似乎不仅仅是append:例如,buf -= 3 也会改变lst
    猜你喜欢
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 2013-04-10
    • 2013-11-29
    相关资源
    最近更新 更多