Warning: file_put_contents(/datas/wwwroot/jiajiahui/core/caches/caches_template/2/default/show.php): failed to open stream: Permission denied in /datas/wwwroot/jiajiahui/core/libraries/classes/template_cache.class.php on line 55

Warning: chmod(): Operation not permitted in /datas/wwwroot/jiajiahui/core/libraries/classes/template_cache.class.php on line 56
你将如何定义一个延迟(by-name)参数来接受一个带参数的函数? - 源码之家

你将如何定义一个延迟(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时,为什么不能使用派生物?我在哪里可以找到更多关于延迟功能的文档?

+0

@DerekMahar完成。请删除你的评论(我也会删除我的)。 – 2012-12-25 13:19:03

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")) 

你会附加参数里面delayingt唯一的一次是,如果它的返回类型是(不是Unit但是)参数的函数类型。

+0

我可以传递返回另一个类型而不是'Unit'的东西吗?或者需要参数?如果是这样,你可以发布一个例子吗? – Geo 2009-12-15 17:36:30

+0

地理位置,是的,您可以通过名称参数传递任何类型的值。我已经在我的答案中发布了一个带参数的例子:参见我的'say'函数。 – 2009-12-15 17:38:36

+0

哦!抱歉。我认为我在思想上过滤了:) – Geo 2009-12-15 17:44:29

因为我有一个可怕的记忆,而答案不提供一个例子,如何真正宣告了一个用名字参数产生一个函数取一个或多个参数,我想出了这个:

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()) 
    } 

}