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
难道我做错了什么吗?这令人费解,我希望得到一些帮助。
答
我相信你的问题是“返回”声明。
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
}
在'multiply2'中,'return'不从传递给'wrapper_function'块返回时,它被阻止返回'作为一个整体乘以2。用'x * 2'替换'return x * 2'。 – Alec
关于'return'的博客文章:https://tpolecat.github.io/2014/05/09/return.html –