在Scala里,我们经常讨论对象-函数编程。它表示什么呢?函数究竟是什么?
函数是一系列的trait。确切地说,有一个参数的函数是Function1 trait的一个实例。这个trait定义了我们之前学到的apply()
的语法糖,它允许你像调用函数一样调用对象。
1
2
3
4
5
6
7
|
scala> object addOne
extends Function1[Int, Int] {
| def apply(m: Int): Int = m +
1
| }
defined module addOne
scala> addOne( 1 )
res2: Int =
2 |
在Scala里有Function1到22。为什么是22?这是一个任意的魔数。我从来没有遇到需要22个参数的函数,所以这个数字还是很有效的。
apply的语法糖使得对象和函数的编程能够组合在一起。你可以把对象作为参数进行传递,同时也可以把它们当作函数使用,而实际上函数也只不过是类的实例。
那这样是不是意味着每次你在类里定义一个方法,那么你就会得到Function的一个实例呢?不,类里的方法仅仅是普通的方法。在repl里单独定义的方法才是Function的实例。
类也可以继承函数,然后这些类的实例就可以通过()来调用。
1
2
3
4
5
6
7
8
9
10
|
scala> class
AddOne extends
Function1[Int, Int] {
| def apply(m: Int): Int = m +
1
| }
defined class
AddOne
scala> val plusOne =
new AddOne()
plusOne: AddOne =
scala> plusOne( 1 )
res0: Int =
2 |
extends Function1[Int,Int]
的一种比较好的简写是extends (Int => Int)
1
2
3
|
class
AddOne extends
(Int => Int) {
def apply(m: Int): Int = m +
1 } |
1
|
|