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

问题描述:

我想创建一个通用的包装函数,可以围绕返回对象的任何方法。 SO问题非常类似于this中的答案。我试过以下内容:Scala:返回泛型类型的包装函数

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 
} 

但是,我观察到在wrapper函数内函数调用后没有任何东西正在执行。具体而言,“执行完成”未被打印。

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

我使用Scala的2.11.8

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

+2

在'multiply2'中,'return'不从传递给'wrapper_function'块返回时,它被阻止返回'作为一个整体乘以2。用'x * 2'替换'return x * 2'。 – Alec

+0

关于'return'的博客文章:https://tpolecat.github.io/2014/05/09/return.html –

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

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

想一想,当你做f:=> T时,你实际上是在拿着这个块并运行它。这个块有一个返回值,它只是从包装中断开并返回值(而不是使用返回值,在这种情况下,它的结果将用于赋值)。

在一般情况下,如果你使用Scala的回报在功能或块的末尾,你几乎总是做错了什么......

阿萨夫门德尔松的答案是在大多数情况下是正确的。但是,它不工作的情况下,你不承认你是包装,或内部函数的代码时有在内部功能使用return一个合法的情况下(见here

对于这种情况下,它会通过在一个try-finally块执行内部函数工作:

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