我正在阅读scala in action(manning edition),并且有一个关于此模式的章节,其中包含一个代码示例:
class PureSquare(val side: Int) {
def newSide(s: Int): PureSquare = new PureSquare(s)
def area = side * side
}
这本书有一个链接应该解释模式。不幸的是,链接被破坏了,我找不到它。
是否有人能够解释这种模式以及这段代码应该如何工作?
因为我在调用区域函数时没有看到如何调用newSide。
谢谢
答案 0 :(得分:5)
您是对的:newSide
不会直接更改area
,但会创建一个长度不同PureSquare
的新side
。
这是为了展示如何使用纯粹的功能性对象(没有可变的内部状态),同时满足在我们的程序中进行更改的需要
使用此模式您创建的任何对象在技术上仍然是 immutable ,但您可以通过调用正确的方法(在本例中为newSide
)来“模拟”更改对象
一个值得100个解释的例子
val square1 = new PureSquare(1)
assert(square1.area == 1)
//this is similar to changing the side of square1
val square2 = square1.newSide(2)
//and the area changes consequently
assert(square2.area == 4)
//while the original call is still referentially transparent [*]
assert(square1.area == 1)
[*] http://en.wikipedia.org/wiki/Referential_transparency_(computer_science)