Scala 有没有一种方法可以只使用一个抽象方法简洁地编写匿名子脚本?
在Scalatest中编写测试时,我使用了所谓的相等[A]特性,这看起来像是省略了文档:Scala 有没有一种方法可以只使用一个抽象方法简洁地编写匿名子脚本?,scala,function,traits,Scala,Function,Traits,在Scalatest中编写测试时,我使用了所谓的相等[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[SomeTyp
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) => ???})
或者按照这条路线,让编译器帮助您解决任何问题。尝试以下方法:
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) => ???})
或者按照这条路线,让编译器帮助您处理Scala 2.12中的任何问题。
implicit def positionEquality: Equality[SomeType] = (a, b) => b match ...
。在Scala 2.11中,它需要-XeExperimental编译器选项IIRC,有时它不能正常工作;不幸的是,我不知道它们到底是什么,也不知道这是否是其中之一,但我不希望如此。在Scala 2.12中
implicit def positionEquality: Equality[SomeType] = (a, b) => b match ...
。在Scala 2.11中,它需要-XeExperimental编译器选项IIRC,有时它不能正常工作;不幸的是,我不知道它们到底是什么,也不知道这是否是其中之一,但我不希望如此。在这种情况下,与t匹配实际上不起作用。您需要def apply[T:ClassTag]来实现此目的。对,反射。在这种情况下,与T匹配实际上不起作用。您需要def apply[T:ClassTag]来完成此操作。对,反射。