重载相等运算符的断言对于三等号失败但通过双重等号
Assertion for overloaded equality operator fails for triple-equals but passes for double-equals
我重载了一个案例 class 的相等运算符:
case class Polygon(points: Seq[(Double, Double)]) extends Shape {
def ==(that: Polygon): Boolean = { ... }
}
在断言中使用双等号时我的单元测试通过了:
import org.scalatest.FunSpec
class ShapeSpec extends FunSpec {
describe("Polygon") {
it("is equal to all its rotations") {
val p = Polygon(Seq( ... ))
for { i ← 0 until p.points.size } {
val q = Polygon(p.points.drop(i) ++ p.points.take(i))
assert(p == q)
}
}
}
}
但是当使用 === 而不是 == 时,同样的测试失败了:
[info] Polygon
[info] - is equal to all its rotations *** FAILED ***
[info] Polygon(List((-1.0,-1.0), (4.0,-1.0), (4.0,2.0), (1.0,2.0),
(1.0,1.0), (-1.0,1.0))) did not equal PolygonM(List((4.0,-1.0),
(4.0,2.0), (1.0,2.0), (1.0,1.0), (-1.0,1.0), (-1.0,-1.0)))
(ShapeSpec.scala:28)
为什么会这样?
你拼错了。 ;)
应该是:
override def equals(x: Any): Boolean
我重载了一个案例 class 的相等运算符:
case class Polygon(points: Seq[(Double, Double)]) extends Shape {
def ==(that: Polygon): Boolean = { ... }
}
在断言中使用双等号时我的单元测试通过了:
import org.scalatest.FunSpec
class ShapeSpec extends FunSpec {
describe("Polygon") {
it("is equal to all its rotations") {
val p = Polygon(Seq( ... ))
for { i ← 0 until p.points.size } {
val q = Polygon(p.points.drop(i) ++ p.points.take(i))
assert(p == q)
}
}
}
}
但是当使用 === 而不是 == 时,同样的测试失败了:
[info] Polygon
[info] - is equal to all its rotations *** FAILED ***
[info] Polygon(List((-1.0,-1.0), (4.0,-1.0), (4.0,2.0), (1.0,2.0),
(1.0,1.0), (-1.0,1.0))) did not equal PolygonM(List((4.0,-1.0),
(4.0,2.0), (1.0,2.0), (1.0,1.0), (-1.0,1.0), (-1.0,-1.0)))
(ShapeSpec.scala:28)
为什么会这样?
你拼错了。 ;)
应该是:
override def equals(x: Any): Boolean