第3章 基本概念
3.1 启动与停止 Erlang shell
- erl : 启动 erlang shell
- Ctrl + C , a (abort) : 立即停止系统,可能导致某些数据破坏
- q() : 受控关闭,所有打开文件被刷入缓存并关闭,功能与 init:stop() 一致
- erlang:halt() : 立即停止系统
3.1.2 可能出错的地方
不能在shell里输入附注(连字符开头的事物,如 -module -export)
3.2 简单的整数运算
Erlang 可用任意长度的整数执行整数运算,在erlang中整数运算是精确的,无需担心运算溢出等。
3.3.1 Erlang 变量不会变
① Erlang 的变量是一次性赋值变量,只能赋值一次。
② 已经指派一个值的变量称为绑定变量,否则称为未绑定变量。
③ X=... 变量作用域是定义时所处的语汇单元,如字句与字句(;相隔)无法共享X变量。
3.3.2 变量绑定与模式匹配
X = (2 + 4).
> 6
X = 6.
> 6 % 这里不会报错,X原来等于6所以匹配6,匹配成功,而非二次赋值
% erlang 中没有可变状态与共享内存,也没有锁。程序并行变得简单
3.4 浮点数
① 两个整数相除,结果会转换成浮点数,如 5 / 3 = 1.666...7
② N div M :让 N 除以 M 然后舍去余数,5 div 3 = 1
③ N rem M : N 除以 M 剩下的余数,5 rem 3 = 2
3.5 原子
① 在 Erlang 中,原子被用于表示常量值
② 在 Erlang 中,原子是全局性的,不需要宏定义或包含文件
③ 原子以小写字母开头,后接一串字母,数字,下划线或@
④ 原子可放在单引号内,可创建以大写字母或其他字符的原子,如 'Monday','a' 与 a 等价。
⑤ 单引号与双引号不可互用,双引号只用于给字符串字面量定界。
3.6 元组
① 元组 tuple :固定数量的成员组成的单一实体,用逗号分隔花括号表示,如 {joe, 123}
3.6.1 创建元组
① 元组会声明时自动创建,不再使用时自动销毁,Erlang 使用一个垃圾收集器来回收所有未使用的内存
② 创建时,不能用未定义的变量,如 {Q, 123} 而 Q 未定义和绑定,则报错
3.6.2 提取元组的值
Point = {point, 10, 45}.
{point, X, Y} = Point. % 则X绑定10,Y绑定45
L = {joe, 123}.
{_, X} = L. % X绑定123,'_'匿名变量,作为占位符,表示不需使用的一些变量
3.7 列表
① 列表 List : 存放任意数量的事物,各元素可以是任意类型,如:[1+7, hello, {cost, apple}, 3]
3.7.1 专用术语
① 列表的第1个元素称为列表头,剩下的元素称为列表尾。如 [1, 2, 3, 4],列表头:1 ,列表尾:[2, 3, 4]。(注意:列表头是一个整数,列表尾是一个列表)
3.7.2 定义列表
① 如果 T 是一个列表,则 [H|T] 也是一个列表,头是H,尾是T。竖线 | 把列表头与尾隔开,[ ] 是一个空列表。
② 当使用 [... | T] 构建列表时,应确保 T 是一个列表。
③ 可给列表头增加不止一个元素,如 [{orange, 4},{apple, 5} | T]
3.7.3 提取列表元素
通过模式匹配操作。如果有一个非空列表L,则 [ X | Y ] = L,会提取表头作为X,列表尾作为Y
3.8 字符串
① 严格说,Erlang 没有字符串,是通过整数列表或二进制型表示字符串。
② 可用字符串字面量创建一个列表,Name = "Hello","Hello" 是一个列表简写,包含了代表字符串里各个字符的Unicode码
③ [97, 98, 99] 返回 "abc",[0, 97, 98, 99] 返回 [0, 97, 98, 99] ,因为0是非打印字符,则其他的一同不打印。
④ $a 表示取a的Unicode(ASCII)码
⑤ X = "ab\x{221e}". 会返回[97, 98, 8734] 。因为 8734 不是可打印的 Latin1 字符编码,所以ab自然没有打印出来。
3.9 模式匹配再探
① [ H | T ] = "cat",则 H = 99, T = "at"
② f(),可以让shell忘记现有的所有绑定,所有变量恢复到未绑定状态。