在Scala中,是否有可能定义一个函数来接收任何其他函数作为参数?
它应该类似于以下内容:
object Module extends SecureModule{
val bc = new MyBC()
def method(parameter: Type) = {
exec(bc.method(parameter))
}
def method2(parameter1: Type1, parameter2: Type2) = {
exec(bc.method2(parameter1,parameter2))
}
}
trait SecureModule {
def exec(f: ANY_PARAMETER => ANY_RESULT) = {
//some extra processing
f
}
}
有可能吗?如果是这样,我怎么能实现这个目标?
提前谢谢。
答案 0 :(得分:2)
关于scala的好处是你可以创建看起来像你自己的语法。
如果你想要做的是包装一个操作,以便你可以进行前后处理,以及控制执行上下文,那么你可以使用call-by-name参数来完成。例如,如果我们只想计算一段代码所花费的时间,那么我们可以这样做:
def timer[T](block: => T): (T,Long) = {
val startDate = new Date()
val result = block
val endDate = new Date()
(result, endDate.getTime()-startDate.getTime())
}
我们可以像这样使用它:
val (result,duration) = timer {
1+3
}
或者像这样
val (result,duration) = timer {
"hello" + " world!"
}
结果将从您传入的块中获得正确的类型,同时还为您提供预期的持续时间。
答案 1 :(得分:1)
我的印象是你的描述有些误导。
我理解它的方式,您(可能)想要做的是延迟bc.method
调用的执行,直到执行了其他一些代码。
如果是这样,试试这个:
object Module extends SecureModule{
val bc = new MyBC()
def method(parameter: Type) = {
exec(() => bc.method(parameter))
}
def method2(parameter1: Type1, parameter2: Type2) = {
exec(() => bc.method2(parameter1,parameter2))
}
}
trait SecureModule {
def exec[Result](f: () => Result): Result = {
//some extra processing
f()
}
}
答案 2 :(得分:0)
您无法将任何功能作为参数。你甚至会做什么?
充其量,您可以使用具有特定数量参数的任何函数。
例如,在这里,f
接受一个参数并返回一个值。
def exec[A,B](f: A => B)
在这里,f
有两个参数:
def exec[A,B,C](f: (A, B) => C)
如果您不关心函数的返回类型,则可以始终使用Any
而不是类型参数,因为函数在返回类型中是协变的:
def exec[A](f: A => Any)