1

我正在阅读 scala in action (manning edition),并且有一章关于这种模式的代码示例:

class PureSquare(val side: Int) {
def newSide(s: Int): PureSquare = new PureSquare(s)
def area = side * side
}

这本书有一个链接应该解释这种模式。不幸的是,链接已损坏,我找不到它。

有人能够解释这种模式以及这段代码应该如何工作吗?

因为我没有看到调用 area 函数时如何调用 newSide。

谢谢

4

1 回答 1

5

你是对的:newSide不会直接改变area,但它会创建一个长度PureSquare不同的新的。side

它旨在展示如何使用纯功能对象(没有可变的内部状态),同时应对在我们的程序中进行更改的需要

使用此模式,您创建的任何对象在技术上都是不可变的,但您可以通过调用正确的方法“模拟”更改对象(在这种情况下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)

于 2013-09-25T08:49:51.240 回答