容器的Scalatest隐式相等
我们定义了一个自定义的容器的Scalatest隐式相等,scala,scalatest,Scala,Scalatest,我们定义了一个自定义的相等[String]: implicit val upperCaseEquality = new Equality[String] { override def areEqual(self: String, b: Any): Boolean = b match { case other: String => self.toUpperCase == other.toUpperCase case _ => false } } 以下代码正常工
相等[String]
:
implicit val upperCaseEquality = new Equality[String] {
override def areEqual(self: String, b: Any): Boolean = b match {
case other: String => self.toUpperCase == other.toUpperCase
case _ => false
}
}
以下代码正常工作:
Seq("a").view should contain theSameElementsInOrderAs Seq("A")
现在,我们为Seq
添加了一个自定义的Equality
:
implicit def SeqEquality[T, SEQ[e] <: GenSeq[e]](implicit equality: Equality[T]): Equality[SEQ[T]] = new Equality[SEQ[T]] {
override def areEqual(self: SEQ[T], b: Any): Boolean = b match {
case other: GenSeq[_] => self.size == other.size && self.zip(other).forall(equality.areEqual _ tupled)
case _ => false
}
}
assert(Seq("a") === Seq("A"))
但不适用于SeqView
:
assert(Seq("a").view === Seq("A"))
Exception in thread "main" org.scalatest.exceptions.TestFailedException: SeqView("a") did not equal List("A")
为什么?如果您看到:
您可以看到,SeqView[\u,\u]
实际上有两个类型参数,因此它不符合您的规范SEQ[e]
def view(from: Int, until: Int): SeqView[A, Seq[A]]
implicit def SeqViewEquality[T](implicit equality: Equality[T]): Equality[SeqView[T, Seq[T]]] = new Equality[SeqView[T, Seq[T]]] {
override def areEqual(self: SeqView[T, Seq[T]], b: Any): Boolean = b match {
case other: GenSeq[_] => self.size == other.size && self.zip(other).forall(equality.areEqual _ tupled)
case _ => false
}
}