【发布时间】:2019-01-11 02:33:51
【问题描述】:
我创建了一个扩展 scala.Immutable 的类
class SomeThing(var string: String) extends Immutable {
override def toString: String = string
}
正如我所料,scala 编译器应该可以帮助我防止更改 SomeThing 类的状态。但是当我运行这个测试时
"Test change state of immutable interface" should "not allow" in {
val someThing = new SomeThing("hello")
someThing.string = "hello 1"
println(someThing)
}
结果是hello 1,scala 编译器不会抛出任何警告或错误。
为什么他们必须添加不可变特征而不帮助我们防止对象可变?
【问题讨论】:
-
如果你想防止变量发生突变,只需将其设为
val而不是var- 这将生成你想要的编译警告。关于scala.Immutable,我以前从未见过,但它似乎只是scala库内部使用的一个普通特征,用于区分 Immutable VS Mutable 数据结构(如集合),我不认为它打算由客户端代码使用。 -
文档说它是一个标记特征。因此,特征的存在使得 you 可以告诉 others 该数据结构是不可变的。在你的情况下,你只是在撒谎。如果您撒谎,编译器将无能为力。请注意,编译器根本不可能检查数据结构是否不可变,事实上,这相当于解决了停机问题。
-
我打开了一个 scala/bug 票,建议弃用该特征并最终从标准库中删除:github.com/scala/bug/issues/11353
标签: scala