有没有办法简单地用一个抽象方法编写匿名子程序?

时间:2016-11-14 11:00:11

标签: scala function traits

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:我只能想象一些隐式转换,但它看起来很奇怪,因为我每次想要使用它时都必须明确地将它带入范围。

2 个答案:

答案 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期待如此)。