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

时间:2010-04-17 09:45:42

标签: scala function methods

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

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

wrapper {
  println("2")
}

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

2 个答案:

答案 0 :(得分:24)

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

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

你现在可以这样做,

wrapper {
  println("2")
}

它会打印

Executing now
2
Execution finished

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

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

答案 1 :(得分:1)

在您的情况下,您已经在执行函数println,然后将结果传递给您的包装器,而期望具有一个参数(Any)的函数并返回Any

不确定这个问题的答案是否可以使用泛型类型参数并接受没有返回该类型的参数的函数:

def wrapper[T](f: () => T) = {
  println("Executing now")
  val res = f() // call the function
  println("Execution finished")
  res
}

wrapper {
  ()=>println("2") // create an anonymous function that will be called
}