Scala:returns 泛型类型的包装函数

Scala: wrapper function that returns a generic type

我正在尝试创建一个通用包装函数,它可以包装 returns 一个对象的任何方法。与 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
}

但是,我观察到在包装函数内调用函数后没有执行任何操作。具体来说,"Execution finished" 没有被打印出来。

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

我正在使用 scala 2.11.8

我是不是做错了什么?这令人费解,我希望得到一些帮助。

我认为您的问题是 "return" 语句。

Return 在 scala 中的工作方式与在 java 中不同。您可以看一下 in this answer,但基本上它是一个 "stack unwinding" 的东西,它会导致您从包装函数 return。

考虑一下,当您执行 f: => T 时,您实际上是在拿走该块,并且 运行 它。这个块有一个 return ,它简单地从包装器中分离出来并 returns 值(而不是不使用 return ,在这种情况下它的结果将用于赋值)。

一般来说,如果您在函数或块的末尾使用 Scala 中的 return,您几乎总是会做错事...

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 
}