Scala是一门多范式的编程语言,一种类似java的编程语言,设计初衷是实现可伸缩的语言 、并集成面向对象编程和函数式编程的各种特性。
特性
面向对象特性
Scala是一种纯面向对象的语言,每一个值都是对象。对象的数据类型以及行为由类和特征(Trait)描述。类抽象机制的扩展有两种途径。一种途径是子类继承,另一种途径是灵活的混入(Mixin)机制。这两种途径能避免多重继承的种种问题。[4]
函数式编程
Scala也是一种函数式语言,其函数也能当成值来使用。Scala提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化 。Scala的Case Class及其内置的模式匹配相当于函数式编程语言中常用的代数类型(Algebraic Type)。[4]
更进一步,程序员可以利用Scala的模式匹配,编写类似正则表达式的代码处理XML数据。在这些情形中,顺序容器的推导式(comprehension)功能对编写公式化查询非常有用。
由于JVM不支持尾部递归,Scala也不能完全支持尾部递归优化。不过,在简单的情况下,Scala编译器可以把尾部递归优化成循环。
以下代码以函数式风格实现了快速排序算法,可以与Erlang快速排序的例子做个比较:
def qsort(list: List[Int]): List[Int]= list match{ case Nil => Nil case pivot::tail => qsort(for(i <- tail if i < pivot)yield i)::: pivot :: qsort(for(i <- tail if i >= pivot)yield i) }
静态类型
Scala是具备类型系统,通过编译时的检查,保证代码的安全性和一致性。类型系统具体支持以下特性:
泛型类,型变注释(Variance Annotation),类型继承结构的上限和下限,把类别和抽象类型作为对象成员,复合类型,引用自己时显式指定类型,视图,多态方法。[4]
扩展性
Scala的设计承认一个事实,即在实践中,某个领域特定的应用程序开发往往需要特定于该领域的语言扩展。Scala提供了许多独特的语言机制,可以以库的形式轻易无缝添加新的语言结构:
任何方法可用作前缀或后缀操作符,可以根据预期类型自动构造闭包。联合使用以上两个特性,使你可以定义新的语句而无须扩展语法也无须使用宏之类的元编程特性。[4]
使用Scala的框架
Lift是一个开源的Web应用框架,旨在提供类似Ruby on Rails的东西。因为Lift使用了Scala,所以Lift应用程序可以使用所有的Java库和Web容器。
测试
以下是测试Scala代码的一些方式:
ScalaTest ScalaCheck,类似于Haskell的QuickCheck的一个库specs,一个用于Scala的行为驱动的开发工具库JUnit内置的Scala库SUnit已经不赞成使用,将会在2.8.0版中移除,见SUnit文档。
范例
以下是用Scala编写的典型的Hello Scala中文程序:
object HelloScalachina extends Application { println("Hello, Scala中文!")}
或
object HelloScalachina {def main(args: Array[String]){ println("Hello, Scala中文!")}}
请注意它与Java的Hello Scala中文应用程序有哪些相似之处。一个显著区别在于,Scala版的Hello Scala中文程序没有把任何东西标记为static,而是用object 关键字创建了一个单件。
假设该程序保存为HelloScalachina.scala文件,接下来可以通过以下命令行进行编译:
> scalac HelloScalachina.scala
若要运行:
> scala -classpath . HelloScalachina
这与编译和运行Java的“Hello Scala中文”程序是不是很像呢?事实上,Scala的编译和执行模型与Java是等效的,因而它也兼容于Java的构建工具,比如Ant.
直接使用Scala解释器也可以运行该程序,使用选项-i (从文件加载代码)和选项-e (若要运行额外的代码,就得实际执行HelloScalachina对象的方法)即可:
> scala -i HelloScalachina.scala -e 'HelloScalachina.main(null)'
在接下来的教程文章将摘录改编于:引路蜂移动软件,菜鸟教程
感觉本站内容不错,读后有收获?小额赞助,鼓励网站分享出更好的教程