scala学习笔记(一)基本概念、标识符、数据类型和字面值
overview
生产力、扩展性和可靠性
- 面向对象的: 所有值都是对象;类型和行为由class和trait描述;可继承和混合重组(多继承的替代).
- 函数式: 函数也是值/对象;轻量化的匿名函数定义;支持higher-order函数;嵌套函数;柯里函数;
- 静态类型:但不需要提供冗余的类型信息
- 与
java
良好的互操作性 - 并发支持:良好的表达能力减少代码行数且类型安全,支持immutable方式从而使并发编程更容易。
scala vs java
- 所有类型都是对象
- 类型推断
- 嵌套函数
- 函数也是对象
- SDL(Domain specific language)支持
- trait
- 闭包
- Erlang式的并发支持
WEb框架
scala在WEB应用中使用广泛,以下是最流行的几个框架
与java
不同的是,行末分号;
是可选的scala
程序可看作是一级对象的集合,对象间通过调用彼此方法通信。以下是一些名词的定义
- 对象: 对象有状态和行为,是类的实例。
- 类:蓝图/模板. 定义对象支持的状态和行为
- 方法:行为。类包括若干传为,数据操作、行为执行等逻辑都体现在方法中。
- 域:每个对象都有唯一的一组当前值,定义了当前状态
- 闭包:首先闭包是一个函数,它的返回值与若干定义于函数之外的变量值有关。
- Trait(物质):特质封装了域和方法定义,并可被混合重用到类中。特质通过指定支持的方法的签名来定义对象类型
第一个scala程序
scala程序可交互式、脚本式地运行。
交互式
脚本式
编辑以下文本保存为hello.scala
编辑并运行:
基本约定
- 大小写敏感
- 类名:大写开头,驼峰式命名
- 方法名:小写开头,驼峰式命名
- 程序文件命名:与对象名一致,以
.scala
结尾。 - def main(args: Array[String]): 所有scala程序从些方法开始执行
scala 标识符
所有scala组件都需要命名,对象,类,变量和方法的命名被称为标识符。关键字不能用途标识符,scala支持四种类型的标识符。
字母数字
$
在scala中是保留字
操作标识符
由一或多个运行符组成。如+
, :
, ?
, ~
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是面向行的编程语言,声明同时可以被分号;
和换行终止. 如果声明独占一行那么;
就可省略,只在多个声明共行时需要;
。
包
包
是命名了的代码模块。包的声明在源文件的第一行非注释行。
包可以被导入当前编译范围,以下声明导入scala.xml
包的全部内容
也可以只导入指定类
和同一包中的多个类
动态应用
enable动态调用的marker trait.
这种物质的实例x允许任意名称和参数与x.meth(args)
相符的函数调用,也允许x.field
形式的域访问,该特性是在2.10
版本中被引入的。
它允许你调用对象并不存在的方法,scala.Dynamic
没有任何成员,它是一个标记接口
/marker interface
,实质的内容由编译器填入。
数据
数据类型的内存与精确度与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
简单而符合直觉。
整数字面值
|
|
浮点字面值
|
|
布尔字面值
true
‘false’
符号字面值
x
是scala.Symbol("x")
的简写,符号是case class
,定义如下。
character 字面值
由单引号标记,可以是unicode
字符或者转义序列
字符串字面值
双引号标记,可以是unicode
字符或者转义序列
多行字符串
由三双引号标记,中间可以是除连续三个(以上)引号的任意字符,不一定是可打印字符,换行和其它符号都允许。
Null 值
null
是scala.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个八进制字符。