Scala

作品详情

外文名
Scala
展开
设计者
Martin Odersky
展开
基于语言
Funnel
展开
英文全称
Scalable Language
展开
开发时间
2001年
展开
语言特性
面相对象、函数式编程
展开




1发展历史





联邦理工学院洛桑(EPFL)的Martin Odersky于2001年基于Funnel的工作开始设计Scala。Funnel是把函数式编程思想和Petri网相结合的一种编程语言。Odersky先前的工作是Generic Java和javac(Sun Java编译器)。Java平台的Scala于2003年底/2004年初发布。.NET平台的Scala发布于2004年6月。该语言第二个版本,v2.0,发布于2006年3月。


截至2009年9月,最新版本是版本2.7.6 。Scala 2.8预计的特性包括重写的Scala类库(Scala collections library)、方法的命名参数和默认参数、包对象(package object),以及Continuation.


2009年4月,Twitter宣布他们已经把大部分后端程序从Ruby迁移到Scala,其余部分也打算要迁移。此外, Wattzon已经公开宣称,其整个平台都已经是基于Scala基础设施编写的。




2语言特性






面向对象特性



Scala是一种纯面向对象的语言,每个值都是对象。对象的数据类型以及行为由类和特质描述。


类抽象机制的扩展有两种途径:一种途径是子类继承,另一种途径是灵活的混入机制。这两种途径能避免多重继承的种种问题。





函数式编程



Scala也是一种函数式语言,其函数也能当成值来使用。Scala提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化。Scala的case class及其内置的模式匹配相当于函数式编程语言中常用的代数类型。


更进一步,程序员可以利用Scala的模式匹配,编写类似正则表达式的代码处理XML数据。





静态类型



Scala具备类型系统,通过编译时检查,保证代码的安全性和一致性。类型系统具体支持以下特性:



  1. 泛型类


  2. 协变和逆变


  3. 标注


  4. 类型参数的上下限约束


  5. 把类别和抽象类型作为对象成员


  6. 复合类型


  7. 引用自己时显式指定类型


  8. 视图


  9. 多态方法






扩展性



Scala的设计秉承一项事实,即在实践中,某个领域特定的应用程序开发往往需要特定于该领域的语言扩展。Scala提供了许多独特的语言机制,可以以库的形式轻易无缝添加新的语言结构:



  1. 任何方法可用作前缀或后缀操作符


  2. 可以根据预期类型自动构造闭包。






并发性


Scala使用Actor作为其并发模型,Actor是类似线程的实体,通过邮箱发收消息。Actor可以复用线程,因此可以在程序中可以使用数百万个Actor,而线程只能创建数千个。在2.10之后的版本中,使用Akka作为其默认Actor实现。




3基础语法





Scala 基本语法需要注意以下几点:


区分大小写 - Scala是大小写敏感的,这意味着标识Hello 和 hello在Scala中会有不同的含义。


类名 - 对于所有的类名的第一个字母要大写。


如果需要使用几个单词来构成一个类的名称,每个单词的第一个字母要大写。


示例:class MyFirstScalaClass


方法名称 - 所有的方法名称的第一个字母用小写。


如果若干单词被用于构成方法的名称,则每个单词的第一个字母应大写。


示例:def myMethodName()


程序文件名 - 程序文件的名称应该与对象名称完全匹配(新版本不需要了,但建议保留这种习惯)。


保存文件时,应该保存它使用的对象名称(记住Scala是区分大小写),并追加".scala"为文件扩展名。 (如果文件名和对象名称不匹配,程序将无法编译)。


示例: 假设"HelloWorld"是对象的名称。那么该文件应保存为'HelloWorld.scala"


def main(args: Array[String]) - Scala程序从main()方法开始处理,这是每一个Scala程序的强制程序入口部分。




标识符



Scala 可以使用两种形式的标志符,字符数字和符号。


字符数字使用字母或是下划线开头,后面可以接字母或是数字,符号"$"在 Scala 中也看作为字母。然而以"$"开头的标识符为保留的 Scala 编译器产生的标志符使用,应用程序应该避免使用"$"开始的标识符,以免造成冲突。


Scala 的命名规则采用和 Java 类似的 camel 命名规则,首字符小写,比如 toString。类名的首字符还是使用大写。此外也应该避免使用以下划线结尾的标志符以避免冲突。符号标志符包含一个或多个符号,如+,:,? 等,比如:


+ ++ : < ?> 

Scala 内部实现时会使用转义的标志符,比如:-> 使用 $colon$minus$greater 来表示这个符号。因此如果你需要在 Java 代码中访问:->方法,你需要使用 Scala 的内部名称 $colon$minus$greater。


混合标志符由字符数字标志符后面跟着一个或多个符号组成,比如 unary_+ 为 Scala 对+方法的内部实现时的名称。字面量标志符为使用"定义的字符串,比如 `x` `yield`。


你可以在"之间使用任何有效的 Scala 标志符,Scala 将它们解释为一个 Scala 标志符,一个典型的使用为 Thread 的 yield 方法, 在 Scala 中你不能使用 Thread.yield()是因为 yield 为 Scala 中的关键字, 你必须使用 Thread.`yield`()来使用这个方法。





关键字



下表列出了 scala 保留关键字,我们不能使用以下关键字作为变量:

















































































abstractcasecatchclass
defdoelseextends
falsefinalfinallyfor
forSomeifimplicitimport
lazymatchnewnull
objectoverridepackageprivate
protectedreturnsealedsuper
thisthrowtraittry
truetypevalvar
whilewithyield
-:==>
<-<:<%>:
#@





注释



Scala 类似 Java 支持单行和多行注释。多行注释可以嵌套,但必须正确嵌套,一个注释开始符号对应一个结束符号。注释在 Scala 编译中会被忽略,实例如下:


 HelloWorld {
/* 这是一个 Scala 程序
* 这是一行注释
* 这里演示了多行注释
*/

() {


println()
}
}




空行和空格


一行中只有空格或者带有注释,Scala 会认为其是空行,会忽略它。标记可以被空格或者注释来分割。




换行符



Scala是面向行的语言,语句可以用分号(;)结束或换行符。Scala 程序里,语句末尾的分号通常是可选的。如果你愿意可以输入一个,但若一行里仅 有一个语句也可不写。另一方面,如果一行里写多个语句那么分号是需要的。例如


 s = ; println(s)






定义包


Scala 使用 package 关键字定义包,在Scala将代码定义到某个包中有两种方式:


第一种方法和 Java 一样,在文件的头定义包名,这种方法就后续所有代码都放在该包中。 比如:


package com.runoob

第二种方法有些类似 C#,如:


package com.runoob {

}

第二种方法,可以在一个文件中定义多个包。


引用


Scala 使用 import 关键字引用包。


 java.awt.Color  

java.awt._

{
...
}

import语句可以出现在任何地方,而不是只能在文件顶部。import的效果从开始延伸到语句块的结束。这可以大幅减少名称冲突的可能性。


如果想要引入包中的几个成员,可以使用selector(选取器):


 java.awt.{Color, Font}


java.util.{HashMap => JavaHashMap}


java.util.{HashMap => _, _}

注意:默认情况下,Scala 总会引入 java.lang._ 、 scala._ 和 Predef._,这里也能解释,为什么以scala开头的包,在使用时都是省去scala.的。





4安装环境





Scala 语言可以运行在Window、Linux、Unix、 Mac OS X等系统上。


Scala是基于java之上,大量使用java的类库和变量,使用 Scala 之前必须先安装 Java(>1.5版本)。




5编程实例




以下是用 Scala 编写的典型 Hello World 程序:



交互式编程



交互式编程不需要创建脚本文件,可以通过以下命令调用:


 


:


:








脚本形式



我们也可以通过创建一个 HelloWorld.scala 的文件来执行代码,HelloWorld.scala 代码如下所示:


 HelloWorld {
/* 这是我的第一个 Scala 程序
* 以下程序将输出'Hello World!'
*/

() {
println()
}
}

接下来我们使用 scalac 命令编译它:


$ scalac HelloWorld.scala 
$ ls
HelloWorld$. .
HelloWorld.

编译后我们可以看到目录下生成了 HelloWorld.class 文件,该文件可以在Java Virtual Machine (JVM)上运行。


编译后,我们可以使用以下命令来执行程序:


$ scala HelloWorld
Hello, world!



声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态
案例
Scala Android 是 Android 上使用 Scale 编程语言开发应用程序的工具。
Lift 也叫 LiftWeb,是一种新的 Web 应用程序框架。它是一种在 Scala 编程语言上构建的可伸缩框架。它非常适合 Apache Geronimo 这样的可伸缩应用服务器,尤其是在...
Griffon Data Science Virtual Environment Griffon Data Science Virtual Machine What is Griffon? Gr...
Scala 是一门类 Java 的编程语言,它结合了面向对象编程和函数式编程。Scala 的设计目的是要和两种主流面向对象编程语言 Java 和 C#实现无缝互操作,这两种主流语言都非纯面向对象。Scala运行在Java虚拟机上,并兼容现有的Java程序。Scala 源代码被编译成Java字节码,所以它可以运行于JVM之上,并可以调用现有的Java类库。
10640
当前共174个项目

评论