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
}
我正在尝试创建一个通用包装函数,它可以包装 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
}