Scala in Depth在mutability
和equality
上呈現此代碼。Scala Equality和HashCode
class Point2(var x: Int, var y: Int) extends Equals {
def move(mx: Int, my: Int) : Unit = {
x = x + mx
y = y + my
}
override def hashCode(): Int = y + (31*x)
def canEqual(that: Any): Boolean = that match {
case p: Point2 => true
case _ => false
}
override def equals(that: Any): Boolean = {
def strictEquals(other: Point2) =
this.x == other.x && this.y == other.y
that match {
case a: AnyRef if this eq a => true
case p: Point2 => (p canEqual this) && strictEquals(p)
case _ => false
}
}
}
然後,它進行評估。
scala> val x = new Point2(1,1)
x: Point2 = [email protected]
scala> val y = new Point2(1,2)
y: Point2 = [email protected]
scala> val z = new Point2(1,1)
z: Point2 = [email protected]
接下來,創建了HashMap
。
scala> val map = HashMap(x -> "HAI", y -> "WORLD")
map: scala.collection.immutable.HashMap[Point2,java.lang.String] =
Map(([email protected],WORLD), ([email protected],HAI))
scala> x.move(1,1)
scala> map(y)
res9: java.lang.String = WORLD
我明白map(x)
將返回NoSuchElementException
因爲x
已經變異。由於x.move(1,1
的突變,x
的hashCode得到重新計算)。因此,當檢查x
是否在map
中時,沒有任何地圖的hashCode
與x
的新hashCode
匹配。
scala> map(x)
java.util.NoSuchElementException: key not found: [email protected]
...
由於z
等於(值)最初插入的HashMap
x
,還有hashCode
,爲什麼是拋出的異常?
scala> map(z)
java.util.NoSuchElementException: key not found: [email protected]
編輯這個例子,在我看來,顯示命令式編程的複雜(壞)。
確定這是提供的代碼嗎?看起來不正確。 –
我從這裏得到 - http://www.manning.com/suereth/SiD-Sample02.pdf –