Scala - 我可以定义一个接收任何函数作为参数的函数吗?
Scala - Can I define a function that receives any function as a parameter?
在 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
}
}
可能吗?如果是这样,我该如何实现?
提前致谢。
您不能将任何函数作为参数。你甚至会怎么做?
充其量,您可以采用任何具有特定数量参数的函数。
例如,这里 f
有一个参数,return 有一个值。
def exec[A,B](f: A => B)
这里,f
有两个参数:
def exec[A,B,C](f: (A, B) => C)
如果您不关心函数的 return 类型,您总是可以使用 Any
而不是类型参数,因为函数在其 return 类型中是协变的:
def exec[A](f: A => Any)
我的印象是您的描述有些误导。
按照我的理解,您(可能)想要做的是延迟 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()
}
}
scala 的好处在于您可以创建似乎是您自己的语法。
如果你想做的是包装一个操作,以便你可以进行预处理和 post 处理,以及控制执行上下文,那么你可以使用按名称调用参数来实现。例如,如果我们只是想计算一段代码需要多长时间,那么我们可以这样做:
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!"
}
结果将具有您传入的块的正确类型,同时还为您提供预期的持续时间。
在 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
}
}
可能吗?如果是这样,我该如何实现?
提前致谢。
您不能将任何函数作为参数。你甚至会怎么做?
充其量,您可以采用任何具有特定数量参数的函数。
例如,这里 f
有一个参数,return 有一个值。
def exec[A,B](f: A => B)
这里,f
有两个参数:
def exec[A,B,C](f: (A, B) => C)
如果您不关心函数的 return 类型,您总是可以使用 Any
而不是类型参数,因为函数在其 return 类型中是协变的:
def exec[A](f: A => Any)
我的印象是您的描述有些误导。
按照我的理解,您(可能)想要做的是延迟 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()
}
}
scala 的好处在于您可以创建似乎是您自己的语法。
如果你想做的是包装一个操作,以便你可以进行预处理和 post 处理,以及控制执行上下文,那么你可以使用按名称调用参数来实现。例如,如果我们只是想计算一段代码需要多长时间,那么我们可以这样做:
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!"
}
结果将具有您传入的块的正确类型,同时还为您提供预期的持续时间。