你将如何定义一个延迟(by-name)参数来接受一个带参数的函数?
问题描述:
我在David Pollak的"Beginning Scala"
中看到delayed
例子。我试图通过反复试验来适应这种情况。这是我有什么:你将如何定义一个延迟(by-name)参数来接受一个带参数的函数?
def sayhello() = {
println("hello")
}
def delaying(t: => Unit):Unit = {
println("before call")
t
println("after call")
}
delaying(sayhello())
你会如何推迟一个函数/方法需要参数?我打电话给t
时,为什么不能使用派生物?我在哪里可以找到更多关于延迟功能的文档?
答
t
不一定是函数值。它只是任何通过名称值计算为Unit
。
当您在delaying
函数中声明t
时,您并未显式调用作为该参数传递的函数。通过声明它,您将强制传入名称参数进行评估,这意味着sayhello()
在此时被评估。
没有理由不能在通过按姓名参数使用功能参数:
def say(word: String) {
println(word)
}
def delaying(t: => Unit) {
println("before call")
t
println("after call")
}
delaying(say("hello"))
你会附加参数里面delaying
的t
唯一的一次是,如果它的返回类型是(不是Unit
但是)参数的函数类型。
答
因为我有一个可怕的记忆,而答案不提供一个例子,如何真正宣告了一个用名字参数产生一个函数取一个或多个参数,我想出了这个:
object DelayedEvalTest {
private class DelayedFunction extends Function1[Int,Unit] {
override def apply(x:Int) : Unit = {}
println("function created")
}
private def eval(eval:Boolean, op : Int => Unit) {
println("in eval()")
if (eval) {
op(42)
}
}
private def evalDelayed(eval:Boolean, op : => Int => Unit) {
println("in evalDelayed()")
if (eval) {
op(42)
}
}
def main(args:Array[String]) {
eval(false , new DelayedFunction())
evalDelayed(false , new DelayedFunction())
}
}
@DerekMahar完成。请删除你的评论(我也会删除我的)。 – 2012-12-25 13:19:03