我有一个简单的函数,我用它来生成通用的Spec2测试:
def check[T <: ED](actual: Seq[T], expectedFile: File)(implicit format: Format[T], ordering: Ordering[T]): Seq[MatchResult[Any]]
def generateCheck(clientName: String, patientId: String, folder: File)
其中 generateCheck 调用检查分配。我想要的不是将check定义为单独的函数,而是将其用作generateChecks的函数参数
我希望有这样的东西:
def generateCheck(clientName: String, patientId: String, folder: File, check: ???)
现在我做了一个解决方法,只是根据需要覆盖检查,但我仍然想知道如何将check定义为功能参数?
答案 0 :(得分:1)
确定。我实际上认为这很简单,但事实并非如此。我对您的代码缺少一些见解,但接下来可能会给您一些想法:
我不认为你可以使用匿名函数进行暗示。至少我没有看到任何地方完成。但你可以很容易地把它包起来:
class Check[T]()(implicit format: Format[T]) extends ((Seq[T], File) => Unit) {
override def apply(v1: Seq[T], v2: File): Unit = ??? // your implementation
}
所以:
def test(check: Check[Int]): Unit = {
check(Seq.empty, new File("."))
}
test(new Check[Int]())
或者如果你可以重构不需要隐式上下文的函数(我只是认为隐式类在这里很好,但不确定它是否适用于你的情况):
implicit class Check[T](val f: (Seq[T], File) => Unit)(implicit format: Format[T]) extends ((Seq[T], File) => Unit) {
override def apply(v1: Seq[T], v2: File): Unit = f(v1, v2) //do some processing and call f
}
现在:
def test(check: Check[Int]): Unit = {
check(Seq.empty, new File("."))
}
test((a: Seq[Int], b: File) => {
println("Hello world")
})
但是你需要记住将类型放入你的函数中,或者手动将它包装在new Check[T]