对于java程序员来说,最新鲜的一点是function也是object。这意味着function也可以当成value一样进行传递。Function are also object in Scala.It is therefore possible to pass funjction as arguments, to store them in variables, and to return them from other functions.
对C语言还有印象的人应该还记得call-back function(回调函数)这个东西。他其实就相当于把函数当做值来传递,不过在C中传递的是这个函数的地址。
object Timer{
def once PerSecond(callback:()=>Uint){
while(ture){callback();Thread sleep 100}
}
def timeFlies(){
println("time flies like an arrow...")
}
def main(arg:Array[String]){
oncePerSecond(timeFlies)
}
}
可以看出 timeFlies函数被当做回调函数注册给了oncePerSecond.这种方式跟c很像,不过,这里面其实有点浪费,因为timeFiles函数其实根本不需要名字,因为它只在一个特定的地方用到了。如果把它想象成“一团东西”,那么只有把“这团东西”塞到他应该呆的位置即可,根本不会有人关心它叫什么名字。
这样,就产生了anonymous function(匿名函数),如下:
object TImeAnonymous{
def oncePerSecond(callback: ()=>Unit){
while(ture) { callback();Thread sleep 1000}
}
def main(args:Array[String]){
oncePersecond( () => println("time flies likes an arrow") )
}
}
可以看到 ()=>println("time flies like an arrow") 就是一个匿名函数,被当成是一个object ,直接塞给了oncePerSecond,这个做法跟javascript的匿名函数很像。
总结:Scala在java的基础之上,将面向对象的“万物皆为对象”的思想更推进了一步,把function也视为object,允许它作为参数出现,也允许他被赋值给一个变量,甚至还运行它作为一个返回值来进行回馈。