我在David Pollak的delayed
中看到了一个"Beginning Scala"
示例。我试图通过反复试验来适应这种情况。这就是我所拥有的:
def sayhello() = {
println("hello")
}
def delaying(t: => Unit):Unit = {
println("before call")
t
println("after call")
}
delaying(sayhello())
你如何延迟一个带参数的函数/方法?我打电话给t
时为什么不能使用parantheses?我在哪里可以找到更多关于延迟函数的文档?
答案 0 :(得分:5)
t
不一定是函数值。它只是任何传递给名称的值,其值为Unit
。
当您在t
函数中声明delaying
时,您没有显式调用作为该参数传递的函数。通过声明它,您将强制计算传递的名称参数,这意味着在此时评估sayhello()
。
没有理由不能在名称传递的参数中使用函数中的参数:
def say(word: String) {
println(word)
}
def delaying(t: => Unit) {
println("before call")
t
println("after call")
}
delaying(say("hello"))
唯一一次将参数附加到t
delaying
内的Unit
,如果它的返回类型是(不是{{1}},而是一个带参数的函数类型。
答案 1 :(得分:1)
由于我有一个可怕的内存并且答案没有提供一个如何实际声明一个带有一个或多个参数的函数的by-name参数的例子,我提出了这个:
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() )
}
}