有没有一种方法可以只用一个抽象方法来简洁地编写匿名子特征?
Is there a way to concisely write anonymous subtrait with only one abstract method?
在 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:我只能想象一些隐式转换,但它看起来很奇怪,因为每次我想使用它时我都必须明确地将它引入范围。
试试这个:
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
。
在 Scala 2.12 中
implicit def positionEquality: Equality[SomeType] = (a, b) => b match ...
should work。在 Scala 2.11 中,它需要 -Xexperimental
编译器选项(IIRC,在某些情况下它无法正常工作;不幸的是,我不知道它们到底是什么,如果这是其中之一,但我不希望如此).
在 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:我只能想象一些隐式转换,但它看起来很奇怪,因为每次我想使用它时我都必须明确地将它引入范围。
试试这个:
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
。
在 Scala 2.12 中
implicit def positionEquality: Equality[SomeType] = (a, b) => b match ...
should work。在 Scala 2.11 中,它需要 -Xexperimental
编译器选项(IIRC,在某些情况下它无法正常工作;不幸的是,我不知道它们到底是什么,如果这是其中之一,但我不希望如此).