6.8 偏应用函数

调用函数可以说成是将函数应用于实参。如果传入所有的预期的参数,就完全应用了这个函数。如果只传入几个参数,就会得到一个偏应用函数。这给了你一个便利,可以绑定几个实参,其他的留在后面填写。我们看个例子:

FunctionValuesAndClosures/Log.scala

  1. import java.util.Date
  2. def log(date: Date, message: String) {
  3. //...
  4. println(date + "----" + message)
  5. }
  6. val date = new Date
  7. log(date, "message1")
  8. log(date, "message2")
  9. log(date, "message3")

上面的代码里,log()方法有两个参数:datemessage。我们想多次调用这个方法,用相同的date、不同的message。通过把log()方法偏应用到data实参上,可以消除每次调用都要传递它的烦恼。

下面代码示例里,先将一个值绑定到date参数上,然后用_使第二个参数未绑定,其结果就是一个偏应用函数,将它存到logWithDateBound这个引用里。现在,就可以只用未绑定的实参message调用这个新的方法了:

FunctionValuesAndClosures/Log.scala

  1. val logWithDateBound = log(new Date, _ : String)
  2. logWithDateBound("message1")
  3. logWithDateBound("message2")
  4. logWithDateBound("message3")

当创建偏应用函数时,Scala内部会创建一个新类,它有一个特殊的apply()方法。调用偏应用函数,实际上是调用这个apply方法——参见8.1节“常见的Scala容器”了解apply方法更多的细节。在第10章“并发编程”你会看到,对于从actor接收的消息进行模式匹配时,Scala广泛地使用了偏应用函数。