Scala 有没有一种方法可以只使用一个抽象方法简洁地编写匿名子脚本?

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

在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[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]来完成此操作。对,反射。