6.8 偏应用函数
调用函数可以说成是将函数应用于实参。如果传入所有的预期的参数,就完全应用了这个函数。如果只传入几个参数,就会得到一个偏应用函数。这给了你一个便利,可以绑定几个实参,其他的留在后面填写。我们看个例子:
FunctionValuesAndClosures/Log.scala
import java.util.Date
def log(date: Date, message: String) {
//...
println(date + "----" + message)
}
val date = new Date
log(date, "message1")
log(date, "message2")
log(date, "message3")
上面的代码里,log()
方法有两个参数:date
和message
。我们想多次调用这个方法,用相同的date
、不同的message
。通过把log()
方法偏应用到data
实参上,可以消除每次调用都要传递它的烦恼。
下面代码示例里,先将一个值绑定到date
参数上,然后用_使第二个参数未绑定,其结果就是一个偏应用函数,将它存到logWithDateBound
这个引用里。现在,就可以只用未绑定的实参message
调用这个新的方法了:
FunctionValuesAndClosures/Log.scala
val logWithDateBound = log(new Date, _ : String)
logWithDateBound("message1")
logWithDateBound("message2")
logWithDateBound("message3")
当创建偏应用函数时,Scala内部会创建一个新类,它有一个特殊的apply()
方法。调用偏应用函数,实际上是调用这个apply
方法——参见8.1节“常见的Scala容器”了解apply
方法更多的细节。在第10章“并发编程”你会看到,对于从actor
接收的消息进行模式匹配时,Scala广泛地使用了偏应用函数。