在Scalatest
中编写测试时,我使用了所谓的Equality[A]
特征,看起来像(省略了文档):
trait Equality[A] extends Equivalence[A] {
def areEqual(a: A, b: Any): Boolean
final def areEquivalent(a: A, b: A): Boolean = areEqual(a, b)
}
我目前正在实施以下
implicit def positionEquality: Equality[SomeType] = new Equality[SomeType] {
override def areEqual(a: SomeType, b: Any): Boolean = b match {
//actual code
}
}
但是我想更简洁地写它......比如函数文字或者一些。有类似的东西吗?
UPD:我只能想象一些隐式转换,但它看起来很奇怪,因为我每次想要使用它时都必须明确地将它带入范围。
答案 0 :(得分:2)
试试这个:
object Equality {
def apply[T: ClassTag](fun: (a: T, b: T) => Boolean) = new Equality[T] {
override def areEqual(a: T, b: Any): Boolean = b match {
case t: T => fun(a, t)
case _ => false
}
}
}
implicit def positionEquality: Equality[SomeType] = Equality({case (a, b) => ???})
或者转到Eq路线,让编译器通过Any
帮助您。
答案 1 :(得分:2)
在Scala 2.12中
implicit def positionEquality: Equality[SomeType] = (a, b) => b match ...
should work。在Scala 2.11中它需要-Xexperimental
编译器选项(IIRC,有些情况下它不能正常工作;不幸的是我不确切地知道它们是什么,如果这是其中之一,但我不会#39; t期待如此)。