如何使Scala的不可变集合保存不可变对象

时间:2010-02-07 09:24:57

标签: scala functional-programming immutability scala-collections

我正在评估Scala,并且我的不可变集合存在问题。

我想制作完全不可变的不可变集合,直到所有包含的对象,它们引用的对象,无限制地。

有一种简单的方法吗?

http://www.finalcog.com/immutable-containers-scala上的代码说明了我想要实现的目标,以及令人讨厌的工作(ImmutablePoint)。

解决方法的问题是,每次我想要更改对象时,我都必须手动创建新副本。我知道运行时必须实现copy-on-write,但这对开发人员来说是否透明?

我想我正在制作不可变对象,其中方法改变当前对象状态,但对象的所有其他'val'(以及所有不可变容器)引用都保留“旧”状态。

2 个答案:

答案 0 :(得分:9)

这不可能通过某种特定的语言构造与scala开箱即用,除非你已经遵循了对象的所有不可变的习语,在这种情况下这种行为是免费的!

对于2.8,从可读性的角度来看,命名参数使得“复制构造函数”非常好用。但你是对的,这可以作为写时复制。您要求的行为,“当前”对象是唯一一个变异的对象完全违背了JVM的工作方式,不幸的是(对您而言)!

实际上,短语“当前对象”毫无意义;你的意思是“当前参考!所有其他引用(在当前词法范围之外)指向同一个对象,erm,指向同一个对象只有一个对象

因此,从当前词汇范围的角度来看,这个对象似乎不可能是可变的,但对其他人而言是不可变的

答案 1 :(得分:2)

如果您对如何有效处理不可变数据结构更新的一些更一般的理论感兴趣,

http://en.wikipedia.org/wiki/Zipper_%28data_structure%29

可能会很有趣。