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()方法接受两个参数:date和message。我们想要多次调用方法,对于date参数保持相同的值,但对于message参数使用不同的值。为了消除每次调用都传递date的噪音,我们可以通过将该参数部分应用于log()方法来解决。为此,我们先绑定一个值到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