Scala部分應用函式

2019-10-16 23:14:42

當在呼叫一個函式時,把這個函式應用到引數中。 如果您傳遞所有預期的引數,則表示您已完全應用它。 如果只傳遞幾個引數並不是全部引數,那麼將返回部分應用的函式。這樣就可以方便地系結一些引數,其餘的引數可稍後填寫補上。

嘗試以下,下面是一個簡單的範例程式用來演示如何使用部分應用函式 -

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 中,使用以下命令編譯和執行此程式。

D:/> scalac Demo.scala
D:/> scala Demo

Mon Dec 02 12:52:41 CST 2018----message1
Mon Dec 02 12:52:41 CST 2018----message2
Mon Dec 02 12:52:41 CST 2018----message3

這裡,log()方法有兩個引數:datemessage。 我們想要多次呼叫該方法,具有相同的日期值,但不同的訊息值。可以通過將引數部分地應用到log()方法來消除將日期傳遞給每個呼叫的干擾。為此,首先將值系結到date引數,並將第二個引數系結到其位置。 結果是儲存在變數中的部分應用函式。

嘗試以下範例程式以僅使用未繫結的引數訊息來呼叫此新方法。

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中,使用以下命令來編譯和執行此程式。

D:\>scalac Demo.scala
D:\>scala Demo

Mon Dec 02 12:53:56 CST 2018----message1
Mon Dec 02 12:53:56 CST 2018----message2
Mon Dec 02 12:53:56 CST 2018----message3