【发布时间】:2015-08-22 00:14:16
【问题描述】:
我们定义一个自定义Equality[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
}
}
自定义TripleEquals平等适用于Seq:
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")
为什么?
【问题讨论】: