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

shr*_*ama 0 scala higher-order-functions

我试图创建一个通用的包装函数,可以包装任何返回对象的方法.非常类似于这个 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
}
Run Code Online (Sandbox Code Playgroud)

但是,我观察到在包装函数内的函数调用之后没有执行任何操作.具体而言,"执行完成"未打印.

scala> val x = multiply2(4)
Executing now
inside multiply2
x: Int = 8
Run Code Online (Sandbox Code Playgroud)

我正在使用scala 2.11.8

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

Ass*_*son 6

我相信你的问题是"回归"声明.

scala中的返回与java中的返回不同.你可以看看这个答案,但基本上它是一个"堆栈展开",它会导致你从包装函数返回.

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

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