如何覆盖
您如何实现函数的相等性,最好使用普通的
equals
方法以在特定情况下检查函数的值等价性?例如,假设我们有以下f
和g
函数。val f = (x: Int) => "worf" + x
val g = (x: Int) => "worf" + x
我们该如何使assert(f == g)
通过测试?
我尝试扩展Function1
并通过生成器实现相等性,代码如下:
trait Function1Equals extends (Int => String) {
override def equals(obj: Any): Boolean = {
val b = obj.asInstanceOf[Function1Equals]
(1 to 100).forall { _ =>
val input = scala.util.Random.nextInt
apply(input) == b(input)
}
}
}
implicit def functionEquality(f: Int => String): Function1Equals = (x: Int) => f(x)
但是在 ==
上无法实现隐式转换,可能是因为这个原因。Scalactic 的TripleEquals
接近实现。
import org.scalactic.TripleEquals._
import org.scalactic.Equality
implicit val functionEquality = new Equality[Int => String] {
override def areEqual(a: Int => String, b: Any): Boolean =
b match {
case p: (Int => String) =>
(1 to 100).forall { _ =>
val input = scala.util.Random.nextInt
a(input) == p(input)
}
case _ => false
}
}
val f = (x: Int) => "worf" + x
val g = (x: Int) => "worf" + x
val h = (x: Int) => "picard" + x
assert(f === g) // pass
assert(f === h) // fail
您如何实现函数的相等性,最好使用普通的
==
操作符?