首先,在Scala里,一切皆对象,函数字面量(匿名函数)也不例外!这也是为什么我们可以把函数字面量赋给一个变量的原因, 是对象就有对应的类型,那么一个函数字面量的真实类型是什么呢?看下面这个例子:
scala> var inc = (x: Int) => x + 1
inc: Int => Int = <function1>
scala> inc.isInstanceOf[Function1[Int,Int]]
res0: Boolean = true
我们在调用上面这个函数的时候直接如下调用:
inc(3)
为什么呢?
在Scala的scala包里,有一系列Function trait,它们实际上就是函数字面量作为“对象”存在时对应的类型。Function类型有多个版本,Function0表示无参数函数,Function1表示只有一个参数的函数,以此类推。
也就是我们上面的函数字面量也是对象,并且是类Function1的对象,那么为什么可以直接加个括号调用呢?原因是因为Function1有一个apply方法,我们知道类中的apply方法调用方式是:对象()
。具体可以参考:Scala的apply.