Scala:返回泛型类型的包装函数

时间:2017-09-14 17:47:53

标签: scala higher-order-functions

我正在尝试创建一个通用的包装函数,它可以包装任何返回对象的方法。与this SO问题中的答案非常相似。我尝试了以下方法:

def wrapper_function[T](f: => T): T = { 
    println("Executing now");
    val ret: T = f;
    println("Execution finished"); 
    ret 
}

def multiply2( x: Int ): Int = wrapper_function {
    println("inside multiply2"); 
    return x*2
}

但是,我观察到在包装函数内的函数调用之后没有执行任何操作。具体来说,“执行完毕”没有打印出来。

scala> val x = multiply2(4)
Executing now
inside multiply2
x: Int = 8

我正在使用scala 2.11.8

我在这里做错了吗?这很令人费解,我将不胜感激。

2 个答案:

答案 0 :(得分:6)

我相信你的问题是“回归”声明。

scala中的返回与java中的相同。你可以看看in this answer,但基本上它是一个“堆栈展开”,它会导致你从包装函数返回。

当你做f:=>时,请考虑你实际上正在采取阻止并运行它。这个块有一个返回,它只是从包装器中断并返回值(而不是使用return,在这种情况下,它的结果将用于赋值)。

一般来说,如果你在函数或块的末尾使用scala中的return,那么你几乎总是做错了......

答案 1 :(得分:0)

Assaf Mendelson的回答在大多数情况下都是正确的。但是,它不适用于您不拥有要包装的内部函数的代码的情况,或 是否使用return的合法情况时内功能(见here

对于这些情况,它将通过在try-finally块中执行内部函数来工作:

def wrapper_function[T](f: => T): T = { 
   println("Executing now");
   val ret: T = try f finally {
      println("Execution finished"); 
   }
   ret 
}