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

11

假设我想要创建一个类似下面这样的小包装器:

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

wrapper {
  println("2")
}

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

2个回答

29
如果您希望您的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
}

2
在您的情况下,您已经执行函数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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接