【发布时间】:2015-05-08 23:57:15
【问题描述】:
我参考this。
我是 ScalaTest 的新手,但我将其解释为,如果我实现了 ==,那么它将用于解释 should equal。但是,我的代码似乎与此相矛盾。
我正在处理Odersky's book - 我正在练习 6.0.3。我已经实现了上述自然数,并添加了相等运算符:
class Succ(x: Nat) extends Nat {
...
override def ==(that:Nat): Boolean = {
try {
(that - this).isZero
} catch {
case _: Throwable => false
}
}
}
object Zero extends Nat {
...
override def ==(that:Nat): Boolean = {
that.isZero
}
}
但是,以下测试用例失败:
def makeNat(n:Integer):Nat = {
if (n < 0) throw new RuntimeException("Can't generate Nat from <0: " + n.toString())
if (n==0) return Zero
else return makeNat(n-1).suc
}
test("Addition is commutative") {
val nats = for (n <- Gen.choose(0, 1000)) yield makeNat(n)
val p = forAll ((nats, "n1"), (nats, "n2")) {
(n1: Nat, n2: Nat) =>
(n1 + n2) should equal (n2 + n1) //Fails
}
}
但是减去参数并与零比较:
test("Addition is commutative") {
val nats = for (n <- Gen.choose(0, 1000)) yield makeNat(n)
val p = forAll ((nats, "n1"), (nats, "n2")) {
(n1: Nat, n2: Nat) =>
((n1 + n2)-(n2+n1)) should equal (Zero) // Passes
}
}
编辑:感谢 dwickern@,这已解决 - 我需要为 equals 方法添加覆盖,而不是 == 方法。即:
override def equals(that:Any): Boolean = that match {
case that:Nat => (that-this).isZero
case _ => false
}
【问题讨论】:
-
你在覆盖什么
==? Scala 的==方法调用标准JavaObject.equals。您应该覆盖equals。 -
我只覆盖了 ==,但是(如上面编辑的那样)我现在也覆盖了 .equals,并且得到了相同的结果。
-
忽略 - 我想我在保存之前运行了测试。现在测试通过了!感谢您的帮助!