1.1.3 Scala是一种多范式语言

因为Scala同时支持函数式和面向对象两种编程范式,所以它是一种多范式的编程语言。 Scala是JVM上第一个统一了函数式和面向对象编程的静态类型语言。那么问题来了,为什么我们在编程中需要多种范式呢?

之所以提供多种范式,主要是为程序员提供若干可供选择的解决问题的风格,以便他们根据待解决问题的特点,选出其中最好的解决方案。 这其实是提供了一种让你可以利用或者混合多种风格工作的框架。 函数式编程可以让你非常容易的从简单的部分(函数)开始做有意思的事情,面向对象编程让你能够利用继承、类等思想来轻松开展和扩展复杂系统。

Timothy Budd的研究告诉我们:“编程心理学的研究成果表明,在对编程专业知识的理解和掌握上,理解不同编程风格的数量比编程的年头儿更重要。”。

在面向对象编程中,最小构建单元是对象,而在函数式编程中,最小构建单元是函数。 Scala是怎样把这两种不同甚至几乎是对立的范式结合在一个编程语言中的呢?其实在Scala中,函数是被当成对象看待的。

函数是对象 将函数式编程和面向对象编程结合在Scala中的一个好处就是将函数当成对象看待。

Scala,做为一个函数式语言,是将函数当成值来看待的,你已经从之前把函数赋给一个变量的例子中看到这一点了。因为在Scala中所有的值都是对象,所以由此可以得出,函数也是对象。让我们再看一下之前的一个例子:

List(1, 2, 3).map((x: Int) => x + 1)

你将一个函数(x: Int) => x + 1作为参数传递给了一个map方法。当编译器遇到这样一个调用时,它会将这个函数参数替代成一个对象,如下:

List(1, 2, 3).map(new Function1[Int, Int]{ def apply(x:Int): Int = x + 1})

发生了什么?鉴于现在的知识量,我们简单解释一下,当Scala编译器遇到带一个参数的函数((x: Int) => x + 1),它会将其替换成一个scala.Function1类的实例,这个实例实现了一个叫apply的方法。 仔细观察不难发现,这个函数的函数体被转移到了apply方法里。 同样的,对于多个参数的函数,Scala也有对应的函数对象。

随着喜爱多范式编程的人们的数量的增加,函数式和面向对象编程之间的界限会逐渐消失。 在接下来对Scala的探索中,你将会看到如何混合利用函数式编程和面向对象编程来解决问题。

链接