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

时间:2015-07-22 17:36:31

标签: function scala parameter-passing

在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
    }
}

有可能吗?如果是这样,我怎么能实现这个目标?

提前谢谢。

3 个答案:

答案 0 :(得分:2)

关于scala的好处是你可以创建看起来像你自己的语法。

如果你想要做的是包装一个操作,以便你可以进行前后处理,以及控制执行上下文,那么你可以使用call-by-name参数来完成。例如,如果我们只想计算一段代码所花费的时间,那么我们可以这样做:

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!"
}

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

答案 1 :(得分:1)

我的印象是你的描述有些误导。 我理解它的方式,您(可能)想要做的是延迟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()
    }
}

答案 2 :(得分:0)

您无法将任何功能作为参数。你甚至会做什么?

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

例如,在这里,f接受一个参数并返回一个值。

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

在这里,f有两个参数:

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

如果您不关心函数的返回类型,则可以始终使用Any而不是类型参数,因为函数在返回类型中是协变的:

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