Scala部分應用函數
當調用的函數,可以說成是將參數給函數。如果通過所有預期的參數,已經完全把它應用。如果隻發送了幾個參數,會得到一個部分應用的函數。這可以綁定一些參數,留下其餘稍後填補,提供了方便。下麵是一個簡單的例子來說明這一概念:
import java.util.Date object Test { def main(args: Array[String]) { val date = new Date log(date, "message1" ) Thread.sleep(1000) log(date, "message2" ) Thread.sleep(1000) log(date, "message3" ) } def log(date: Date, message: String) = { println(date + "----" + message) } }
當上述代碼被編譯和執行時,它產生了以下結果:
C:/>scalac Test.scala C:/>scala Test Mon Dec 02 12:52:41 CST 2013----message1 Mon Dec 02 12:52:41 CST 2013----message2 Mon Dec 02 12:52:41 CST 2013----message3 C:/>
在這裡,log()方法有兩個參數:date和message。想調用這個方法多次,對於date使用不同的值,但message的值相同。我們可以消除部分采用的參數傳遞給log()方法傳遞的date給每個調用會有乾擾。要做到這一點,我們首先綁定一個值到date參數,並把下劃線在其位置第二個參數綁定。其結果是,我們已經存儲在一個變量的部分應用函數。現在可以與未結合的mesage參數調用這個新方法如下:
import java.util.Date object Test { def main(args: Array[String]) { val date = new Date val logWithDateBound = log(date, _ : String) logWithDateBound("message1" ) Thread.sleep(1000) logWithDateBound("message2" ) Thread.sleep(1000) logWithDateBound("message3" ) } def log(date: Date, message: String) = { println(date + "----" + message) } }
當上述代碼被編譯和執行時,它產生了以下結果:
C:/>scalac Test.scala C:/>scala Test Mon Dec 02 12:53:56 CST 2013----message1 Mon Dec 02 12:53:56 CST 2013----message2 Mon Dec 02 12:53:56 CST 2013----message3 C:/>