Scala - 部分應用函式



呼叫函式時,據說你正在將函式應用於引數。如果你傳遞所有預期的引數,你就已經完全應用了它。如果你只發送一些引數,那麼你將得到一個部分應用的函式。這讓你可以方便地繫結一些引數,而將其餘引數留待以後填充。

試試下面的例子,這是一個簡單的程式,用於演示部分應用函式:

示例

import java.util.Date

object Demo {
   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)
   }
}

將上述程式儲存為 **Demo.scala**。以下命令用於編譯和執行此程式。

命令

C:/>scalac Demo.scala
C:/>scala Demo

輸出

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

這裡,log() 方法接受兩個引數:datemessage。我們想多次呼叫此方法,使用相同的 date 值但不同的 message 值。我們可以透過將該引數部分應用於 log() 方法來消除每次呼叫都傳遞 date 的冗餘。為此,我們首先將一個值繫結到 date 引數,並透過在其位置放置一個下劃線來留下第二個引數未繫結。結果是一個部分應用的函式,我們已將其儲存在一個變數中。

嘗試以下示例程式,僅使用未繫結的引數 message 呼叫此新方法。

示例

import java.util.Date

object Demo {
   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)
   }
}

將上述程式儲存為 **Demo.scala**。以下命令用於編譯和執行此程式。

命令

\>scalac Demo.scala
\>scala Demo

輸出

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
scala_functions.htm
廣告