Scala - 我可以定义一个接收任何函数作为参数的函数吗?

Scala - Can I define a function that receives any function as a parameter?

在 Scala 中,是否可以定义一个函数来接收任何其他函数作为参数?

应该是这样的:

object Module extends SecureModule{
    val bc = new MyBC()

    def method(parameter: Type) = {
        exec(bc.method(parameter))
    }
    def method2(parameter1: Type1, parameter2: Type2) = {
        exec(bc.method2(parameter1,parameter2))
    }
}

trait SecureModule {
    def exec(f: ANY_PARAMETER => ANY_RESULT) = {
        //some extra processing
        f
    }
}

可能吗?如果是这样,我该如何实现?

提前致谢。

您不能将任何函数作为参数。你甚至会怎么做?

充其量,您可以采用任何具有特定数量参数的函数。

例如,这里 f 有一个参数,return 有一个值。

def exec[A,B](f: A => B)

这里,f 有两个参数:

def exec[A,B,C](f: (A, B) => C)

如果您不关心函数的 return 类型,您总是可以使用 Any 而不是类型参数,因为函数在其 return 类型中是协变的:

def exec[A](f: A => Any)

我的印象是您的描述有些误导。 按照我的理解,您(可能)想要做的是延迟 bc.method 调用的执行,直到执行了其他一些代码。 如果是这样,试试这个:

object Module extends SecureModule{
    val bc = new MyBC()

    def method(parameter: Type) = {
        exec(() => bc.method(parameter))
    }
    def method2(parameter1: Type1, parameter2: Type2) = {
        exec(() => bc.method2(parameter1,parameter2))
    }
}

trait SecureModule {
    def exec[Result](f: () => Result): Result = {
        //some extra processing
        f()
    }
}

scala 的好处在于您可以创建似乎是您自己的语法。

如果你想做的是包装一个操作,以便你可以进行预处理和 post 处理,以及控制执行上下文,那么你可以使用按名称调用参数来实现。例如,如果我们只是想计算一段代码需要多长时间,那么我们可以这样做:

def timer[T](block: => T): (T,Long) = {
  val startDate = new Date()
  val result = block
  val endDate = new Date()
  (result, endDate.getTime()-startDate.getTime())
}

我们可以这样使用:

val (result,duration) = timer {
  1+3
}

或者像这样

val (result,duration) = timer {
  "hello" + " world!"
}

结果将具有您传入的块的正确类型,同时还为您提供预期的持续时间。