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
广告