【问题标题】:How can I take any function as input for my Scala wrapper method?如何将任何函数作为 Scala 包装器方法的输入?
【发布时间】:2011-02-09 02:51:42
【问题描述】:
假设我想按照以下方式制作一个小包装:
def wrapper(f: (Any) => Any): Any = {
println("Executing now")
val res = f
println("Execution finished")
res
}
wrapper {
println("2")
}
这有意义吗?我的包装方法显然是错误的,但我认为我想要做的精神是可能的。我这样想对吗?如果是这样,解决方案是什么?谢谢!
【问题讨论】:
标签:
scala
function
methods
【解决方案1】:
如果您希望 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
}