2013-09-25 40 views
1

我读的行动斯卡拉(曼宁版),而且在这种模式一章用一个代码示例:什么是接班人价值模式

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

这本书有应该解释模式的链接。不幸的是,链接被破坏,我找不到它。

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

因为在调用区域函数时我看不到newSide是如何调用的。

谢谢

回答

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)

+0

OK,所以你想改变侧各一次,你必须调用newSide实际上创建了一个新的对象,使对象不可改变的。感谢您的回答! – unludo

+2

@unludo但任何引用旧版本的内容都不会看到更改。这实际上被看作是一件好事,因为它允许理智的并发,避免同步死锁等等。 – itsbruce