我正在尝试创建一个通用的包装函数,它可以包装任何返回对象的方法。与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
我在这里做错了吗?这很令人费解,我将不胜感激。
答案 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
}