2009-12-15 77 views
2

我在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

回答

5

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

1

因爲我有一個可怕的記憶,而答案不提供一個例子,如何真正宣告了一個用名字參數產生一個函數取一個或多個參數,我想出了這個:

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

} 
相關問題