Contents
  1. 1. overview
  2. 2. scala vs java
  3. 3. WEb框架
  4. 4. scala basis
  5. 5. 第一个scala程序
  6. 6. 基本约定
  7. 7. scala 标识符
    1. 7.1. 字母数字
  8. 8. 操作标识符
    1. 8.1. mixed identifier 混合标识符
    2. 8.2. literal 标识符
  9. 9. 关键字
  10. 10. 注释
  11. 11. 空行与空格
  12. 12. 换行符
  13. 13.
  14. 14. 动态应用
  15. 15. 数据
  16. 16. 基本literal
    1. 16.1. 整数字面值
    2. 16.2. 浮点字面值
    3. 16.3. 布尔字面值
    4. 16.4. 符号字面值
    5. 16.5. character 字面值
    6. 16.6. 字符串字面值
    7. 16.7. 多行字符串
    8. 16.8. Null 值
    9. 16.9. 转义符

overview

生产力、扩展性和可靠性

  • 面向对象的: 所有值都是对象;类型和行为由class和trait描述;可继承和混合重组(多继承的替代).
  • 函数式: 函数也是值/对象;轻量化的匿名函数定义;支持higher-order函数;嵌套函数;柯里函数;
  • 静态类型:但不需要提供冗余的类型信息
  • java良好的互操作性
  • 并发支持:良好的表达能力减少代码行数且类型安全,支持immutable方式从而使并发编程更容易。

scala vs java

  • 所有类型都是对象
  • 类型推断
  • 嵌套函数
  • 函数也是对象
  • SDL(Domain specific language)支持
  • trait
  • 闭包
  • Erlang式的并发支持

WEb框架

scala在WEB应用中使用广泛,以下是最流行的几个框架

  • The Lift Framework
  • The Play framework
  • The Bowler framework

    scala basis

java不同的是,行末分号;是可选的
scala程序可看作是一级对象的集合,对象间通过调用彼此方法通信。以下是一些名词的定义

  • 对象: 对象有状态和行为,是类的实例。
  • 类:蓝图/模板. 定义对象支持的状态和行为
  • 方法:行为。类包括若干传为,数据操作、行为执行等逻辑都体现在方法中。
  • 域:每个对象都有唯一的一组当前值,定义了当前状态
  • 闭包:首先闭包是一个函数,它的返回值与若干定义于函数之外的变量值有关。
  • Trait(物质):特质封装了域和方法定义,并可被混合重用到类中。特质通过指定支持的方法的签名来定义对象类型

第一个scala程序

scala程序可交互式、脚本式地运行。
交互式

1
2
3
4
5
6
chen@vaio:~$ scala
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_92).
Type in expressions for evaluation. Or try :help.
scala> println("hello scala\n")
hello scala

脚本式
编辑以下文本保存为hello.scala

1
2
3
4
5
object Hello{
def main(args: Array[String]){
println("hello world!\n")
}
}

编辑并运行:

1
2
3
scalac Hello.scala
chen@vaio:/data/myscala$ scala Hello
hello world!

基本约定

  • 大小写敏感
  • 类名:大写开头,驼峰式命名
  • 方法名:小写开头,驼峰式命名
  • 程序文件命名:与对象名一致,以.scala结尾。
  • def main(args: Array[String]): 所有scala程序从些方法开始执行

scala 标识符

所有scala组件都需要命名,对象,类,变量和方法的命名被称为标识符。关键字不能用途标识符,scala支持四种类型的标识符。

字母数字

$在scala中是保留字

1
age, salary, _value, __1_value

操作标识符

由一或多个运行符组成。如+, :, ?, ~ or #
以下是合法的操作符标识符

+, ++, :::,<?>, :>
scala编译器会于内部将运算标识符(or操作标识符)转变了合法的java内置的带$的标识符。例如:->在内部表示为$colon$minus$greater

mixed identifier 混合标识符

字母数字标识符与运算标识符的组合
unary_+, myvar_=
以上unary_+是函数名,定义了一个unary+运算,unary_=也是函数名,定义了unary的赋值操作。

literal 标识符

任意由`包裹的字符串。x`<clinit> yield

关键字

abstract case catch Class
def do else exten
false final finally For
forSome if implicit import
lazy match new Null
object override package private
protected return sealed super
this throw trait Try
true type val Var
while with yield
- : = =>
<- <: <% >:
# @

注释

基本与java相同,允许多行注释嵌套

空行与空格

只包含空格、注释的行称为空行,编译器直接无视。tokens能被空白符与注释分割。

换行符

scala是面向行的编程语言,声明同时可以被分号和换行终止. 如果声明独占一行那么就可省略,只在多个声明共行时需要

1
val s = "hello"; println(s)

是命名了的代码模块。包的声明在源文件的第一行非注释行。

1
package com.liftcode.stuff

包可以被导入当前编译范围,以下声明导入scala.xml包的全部内容

1
import scala.xml._

也可以只导入指定类

1
import scala.collection.mutable.HashMap

和同一包中的多个类

1
import scala.collection.immutable.{TreeMap, TreeSet}

动态应用

enable动态调用的marker trait.

这种物质的实例x允许任意名称和参数与x.meth(args)相符的函数调用,也允许x.field形式的域访问,该特性是在2.10版本中被引入的。

它允许你调用对象并不存在的方法,scala.Dynamic没有任何成员,它是一个标记接口/marker interface,实质的内容由编译器填入。

1
2
3
4
5
6
7
8
9
10
11
12
13
//指定调用方法名与参数值
foo.method("blah") ~~> foo.applyDynamic("method")("blah")
//指定调用方法名与字典式参数指定
foo.method(x = "blah") ~~> foo.applyDynamicNamed("method")(("x", "blah"))
foo.method(x = 1, 2) ~~> foo.applyDynamicNamed("method")(("x", 1), ("", 2))
//域访问
foo.field ~~> foo.selectDynamic("field")
//域赋值
foo.varia = 10 ~~> foo.updateDynamic("varia")(10)
//数组类型的域赋值
foo.arr(10) = 13 ~~> foo.selectDynamic("arr").update(10, 13)
//数组类型方法调用
foo.arr(10) ~~> foo.applyDynamic("arr")(10)

数据

数据类型的内存与精确度与java完全相同

Data Type Description
Byte 8 bit signed value. Range from -128 to 127
Short 16 bit signed value. Range -32768 to 32767
Int 32 bit signed value. Range -2147483648 to 2147483647
Long 64 bit signed value. -9223372036854775808 to 9223372036854775807
Float 32 bit IEEE 754 single-precision float
Double 64 bit IEEE 754 double-precision float
Char 16 bit unsigned Unicode character. Range from U+0000 to U+FFFF
String A sequence of Chars
Boolean Either the literal true or the literal false
Unit Corresponds to no value
Null null or empty reference
Nothing The subtype of every other type; includes no values
Any The supertype of any type; any object is of type Any
AnyRef The supertype of any reference type

以上所有类型都是对象,没有java中的基本数据类型,可以直接调用它们的方法。

基本literal

scala的字面值/literal简单而符合直觉。

整数字面值

1
2
3
4
5
0
035
21
0xFFFF
0777L

浮点字面值

1
2
3
4
5
0.0
1e30f
3.14159f
1.0e100
.1

布尔字面值

true ‘false’

符号字面值

xscala.Symbol("x")的简写,符号是case class,定义如下。

character 字面值

由单引号标记,可以是unicode字符或者转义序列

1
2
3
4
'a'
'\u0041'
'\n'
'\t'

字符串字面值

双引号标记,可以是unicode字符或者转义序列

1
2
"Hello,\nWorld!"
"This string contains a \" character."

多行字符串

由三双引号标记,中间可以是除连续三个(以上)引号的任意字符,不一定是可打印字符,换行和其它符号都允许。

1
2
3
"""the present string
spans three
Lines."""

Null 值

nullscala.Null类型,因此与任何引用类型兼容,意为等于特殊值null引用值。

转义符

以下是可被识别的字符与字符串转义

Escape Sequences Unicode Description
\b \u0008 backspace BS
\t \u0009 horizontal tab HT
\n \u000c formfeed FF
\f \u000c formfeed FF
\r \u000d carriage return CR
\” \u0022 double quote”
\’ \u0027 single quote.
\\ \u005c backslash \

Unicode值在0-255之间的字符也可以用八进制的转义表示,如\后跟不超过3个八进制字符。

1
2
3
4
5
object Demo {
def main(args: Array[String]) {
println("Hello\tWorld\n\n" );
}
}

Contents
  1. 1. overview
  2. 2. scala vs java
  3. 3. WEb框架
  4. 4. scala basis
  5. 5. 第一个scala程序
  6. 6. 基本约定
  7. 7. scala 标识符
    1. 7.1. 字母数字
  8. 8. 操作标识符
    1. 8.1. mixed identifier 混合标识符
    2. 8.2. literal 标识符
  9. 9. 关键字
  10. 10. 注释
  11. 11. 空行与空格
  12. 12. 换行符
  13. 13.
  14. 14. 动态应用
  15. 15. 数据
  16. 16. 基本literal
    1. 16.1. 整数字面值
    2. 16.2. 浮点字面值
    3. 16.3. 布尔字面值
    4. 16.4. 符号字面值
    5. 16.5. character 字面值
    6. 16.6. 字符串字面值
    7. 16.7. 多行字符串
    8. 16.8. Null 值
    9. 16.9. 转义符