aio*_*obe 9 scala immutability
我刚刚参加了暑期学校的斯卡拉讲座.讲师得到了以下问题:
- "有没有办法让编译器判断一个类是不可变的?"
讲师回答说
- "不,没有.如果可能的话会非常好. "
我很惊讶.不仅仅是检查该类是否包含任何var-members?
什么是不可改变的?
检查对象是否只包含val字段是不可变性的过度扩展 - 对象可能很好地包含vars,但从不在其中分配不同的值.或者,为vars 分配值的程序段可能无法访问.
根据Chris Okasaki的术语,存在不可变数据结构和功能数据结构.
不可变数据结构(或类)是一种数据结构,一旦在内存中构造,就永远不会改变其组件和值 - 例如Scala元组.
但是,如果将对象的不变性定义为自身的不变性以及通过对象引用可到达的所有对象,则元组可能不是不可变的 - 它取决于您稍后使用它实例化的内容.有时在编译时没有足够的关于程序的信息来确定给定的数据结构是否在仅包含vals 的意义上是不可变的.并且由于多态性而缺少信息,无论是参数,子类型还是ad-hoc(类型类).
这是决定不变性的第一个问题 - 缺乏静态信息.
功能数据结构是一种数据结构,您可以在其上执行操作,其输出仅取决于给定状态的输入.这种数据结构的一个例子是搜索树,它通过将最后一个项目存储在可变字段中来缓存该项目.即使每个查找都会将搜索到的最后一项写入可变字段,因此如果再次查找该项,则不必重复搜索,这样的数据结构的查找操作的输出始终保持不变没人在里面插入新物品.功能数据结构的另一个例子是splay树.
在一般命令式编程模型中,要检查操作是否纯粹,即 - 输出仅依赖于输入,是不可判定的.同样,人们可以使用诸如抽象解释之类的技术来提供保守的答案,但这不是纯度问题的精确答案.
这是决定某些东西是否具有var不可变性或功能性(可观察到不可变)的第二个问题- 不可判定性.
我认为问题是你需要确保你所有人val都没有任何var成员.这你不能.考虑
class Base
case class Immutable extends Base { val immutable: Int = 0 }
case class Mutable extends Base { var mutable: Int = _ }
case class Immutable_?(b: Base)
Run Code Online (Sandbox Code Playgroud)
尽管Immutable_?(Immutable)确实是不可改变的,但事实Immutable_?(Mutable)并非如此.
| 归档时间: |
|
| 查看次数: |
824 次 |
| 最近记录: |