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
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态
案例
思源宋体是 Adobe Type 发布的最新泛 CJK 字体,它是对应于 思源黑体 的宋体字体;我们发布这两种字体是为了响应统一设计的需求,以服务于东亚 15 亿人口。 思源宋体支持四种不同的东...
作为 Kafka 审计系统,Chaperone 监控数据流的完整性和延迟。审计指标持久存储在数据库中,供 Kafka 用户量化其主题的损失。 Chaperone 的目标是在数据流经数据管道的每个...
BigDL,是 Intel 开源的一个基于 Apache Spark 的分布式深度学习库。使用 BigDL ,用户可以将他们的深度学习应用程序作为标准的 Spark 程序,它可以直接运行在现有的...
OpenWhisk 是一个由 IBM 开源的、事件驱动的无服务器计算平台,你可以将操作代码发送给 OpenWhisk,然后提供 OpenWhisk 代码要处理的数据流。OpenWhisk 负责处...
Kamon 是一组用于监控运行在 JVM 上的应用的工具和框架。 示例代码: public class GetStarted {   public static void main(Str...
当前共174个项目

评论