如何使用隐式参数定义函数参数

时间:2016-04-11 18:57:29

标签: scala functional-programming functional-dependencies

我有一个简单的函数,我用它来生成通用的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定义为功能参数?

1 个答案:

答案 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]