Scala in Depth представляет этот код на mutability
и equality
.Scala Equality and 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
's hashCode получает пересчет из-за мутации x.move(1,1
). В результате при проверке, находится ли x
в map
, ни один из s карты не соответствует x
's new hashCode
.
scala> map(x)
java.util.NoSuchElementException: key not found: [email protected]
...
С z
равно (значение) первоначально вставлен x
из HashMap
, а также hashCode
, почему выбрасывается исключение?
scala> map(z)
java.util.NoSuchElementException: key not found: [email protected]
EDIT Этот пример, на мой взгляд, показывает сложность (плохой) от императивного программирования.
Вы уверены, что это код? Не выглядит правильным. –
Я получил отсюда - http://www.manning.com/suereth/SiD-Sample02.pdf –