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()方法采用两个参数:日期消息。我们希望多次调用该方法,使用相同的日期值,但使用不同的消息值。我们可以通过将该参数部分应用于 log() 方法来消除将日期传递给每个调用的噪音。为此,我们首先将一个值绑定到日期参数,并通过在第二个参数的位置添加下划线来保留第二个参数的未绑定状态。结果是我们存储在变量中的部分应用函数。

尝试以下示例程序,仅使用未绑定的参数消息来调用此新方法。

例子

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