因为偶然在Coursera上看到了Scala的系列课程,然后点进去看看发现是介绍Scala这门函数式与面向对象的混合式语言的。想到自己对函数式语言挺感兴趣的,自然就报名了。于是乎,忙完了前几天的东西,这一两天就一直在看Programming in Scala。虽然才看了几章,但是自己是连呼过瘾啊。不得不说,这门语言比自己学的C++,Java啥的有趣多了。
在这里,总结一些Scala的知识点。不过,因为自己只找到了Programming in Scala(2nd edition),而这本书的源代码是基于2.7.2,跟现在最近版的Scala 2.11.8有点区别,比如说Actor类在现在的2.11.8就属于depreacted了,而改用Akka了。
列一下现在学到的东西:
变量在Scala有两类,var和val,分别对应mutable和immutable。推荐是使用val,因为这符合函数式编程的风格。而使用var则会偏向于imperative style。
Scala除了支持一些基本类型的变量类型之外,还支持List,Tuples,Array,Set,Map等。List,Set,Map都有两种类型,immutable和mutable,默认是使用immutable(因为作者鼓励使用immutable,没有side effect),如果需要使用mutable的List,Set,Map就需要import。不过,我有个疑问,如果既要用到immutable的List、Set、Map;又需要用到它们的immutable类型,这时该怎么办,难道需要显示指明用哪个List之类吗?
Scala属于函数式和面向对象的混合语言。面向对象体现在Scala中,所有的东西都是对象,比如说算术式1+2,事实上在Scala是这样计算的,对象1调用它的+,传入参数2,最后返回结果。函数式体现在函数在Scala属于一等公民,意味着就是把函数看成一种特殊的值,可以传入函数作为参数,也可以把函数作为值返回
这里要注意的是访问List元素,不是想Python那样使用[]运算符,而是()。因为List是一个对象,实际上访问其中的元素,是把下标作为参数传入,然后返回一个对象。另外还需要注意的是访问Tuple的元素,是使用这样的一种方法:首先是一个圆点(.),然后跟上一个下划线(_),最后跟上要访问的元素下标。不过,Tuple使用的是1-based下标。之所以不用()来访问元素,是因为()每次都会访问相同类型的元素,而Tuple里装的是不同类型的元素,所以不可以使用()。
Scala支持书写脚本或者构建大型的应用的程序。不过,如果是脚本文件的话,那么文件最后一定是返回一个表达式,否则就不能运行,而应用程序则没有这个限制。要运行的脚本的话,只需要在控制台键入命令:
scala filename.scala
就可以运行脚本了。如果说,应用程序的话,就需要像Java先编译在运行。因为Scala也是运行在JVM上,所以编译Scala也会产生class文件。编译命令:
scalac filename.scala
运行命令
scala class
事实上,Scala之所以能够运行脚本文件,是因为Scala把Scala源代码翻译成Java字节码,然后通过一个class loader加载字节码,并且执行字节码。