如何将任何函数作为Scala包装器方法的输入?

pr1*_*001 10 methods scala function

假设我想按照以下方式制作一个小包装:

def wrapper(f: (Any) => Any): Any = {
  println("Executing now")
  val res = f
  println("Execution finished")
  res
}

wrapper {
  println("2")
}
Run Code Online (Sandbox Code Playgroud)

这有意义吗?我的包装方法显然是错误的,但我认为我想做的精神是可能的.我这么认为是对的吗?如果是这样,解决方案是什么?谢谢!

Ben*_*ngs 25

如果希望wrapper方法在自身内部执行包装方法,则应将参数更改为"按名称".这使用了语法=> ResultType.

def wrapper(f: => Any): Any = {
  println("Executing now")
  val res = f
  println("Execution finished")
  res
}
Run Code Online (Sandbox Code Playgroud)

你现在可以这样做,

wrapper {
  println("2")
}
Run Code Online (Sandbox Code Playgroud)

它会打印出来

Executing now
2
Execution finished
Run Code Online (Sandbox Code Playgroud)

如果您希望能够使用包装函数的返回类型,则可以使方法具有通用性:

def wrapper[T](f: => T): T = {
  println("Executing now")
  val res: T = f
  println("Execution finished")
  res
}
Run Code Online (Sandbox Code Playgroud)