scala:函数即对象

来源:互联网 发布:擎洲软件 编辑:程序博客网 时间:2024/05/16 08:22

在Scala里,我们经常讨论对象-函数编程。它表示什么呢?函数究竟是什么?

函数是一系列的trait。确切地说,有一个参数的函数是Function1 trait的一个实例。这个trait定义了我们之前学到的apply()的语法糖,它允许你像调用函数一样调用对象。

1
2
3
4
5
6
7
scala> object addOneextends 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> classAddOne extends Function1[Int, Int] {
| def apply(m: Int): Int = m +1
| }
defined classAddOne
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
0 0
原创粉丝点击