第一节 基本概念
变量
在erlang中所有的变量名必须以大写字母开头. 例如:X = 1.在shell中输入X就会得到1.erlang中的变量有一个特点,就是一旦被赋值不可改变.
例如:X = 1.已经在之前的shell被赋值,再次赋值X = 2.的时候就会报错** exception error: no match of right hand side value 2
"="在erlang中,变量获得值是一次成功模式匹配操作的结果.别的语言中,=是赋值语句,但是在erlang中,=是一次模式匹配操作.(Lhs = Rhs的真正意思是:计算右侧Rhs的值,然后将结果与左侧Lhs的模式相匹配).
我们举个例子:
X = (2+4).
6
Y = 10.
10
X = 6.
6
X = Y.
这时候就会报错因为X和Y不能匹配.
为什么erlang要用一次赋值:因为在erlang中变量只不过是对某个值的引用,erlang的实现方式用指针代表绑定变量,指向一个包含值的存储区.这个值不能被修改.
浮点数
在erlang中,当你用/给两个整数做除法的时候,结果会自动转换成浮点数.
erlang在内部使用64位的IEEE 754-1985浮点数,因此使用浮点数的程序会存在和C等语言一样的浮点数取整与精度的问题.
原子
在erlang中,原子被用于表示常量值.在erlang中原子是全局性的,而且不需要宏定义或包含文件就能实现.(原子以小写字母开头,后接一串字母,数字下划线或者@等符号,例如:red,december,cat@cat和a_long_name等).
原子还可以放在单引号(')中.例如:'Monday','+'等.
元组
创建元组的方法使用大括号把想表达的值括起来,并用逗号分隔它们.例如:P = {10,20}.这就是一个元组
我们之前说过=看上去像是赋值语句,其实是一个模式匹配操作符.它被用于从数据结构里提取值,控制函数内部的流程,并在并行程序里给进程发消息时,还会用它选择该处理那些消息.
我们举例看下怎么提取一些值.
1> Point = {point, 10, 45}.
{point,10,45}
2> {point, X, Y} = Point.
{point,10,45}
3> X.
10
4> Y.
45
这样我们就通过模式匹配操作符获到了元组中的值(另外符号_被称为匿名变量.与正规变量不同,同一模式里的多个_不必绑定相同的值.例如{_,{_,Who,_},_} = {person,{name,joe,armstrong},{footsize,42}}. Who的值就是joe)
列表
列表(list)被用于存放任意数量的事物.创建列表的方法是用中括号把列表元素括起来,并用逗号分隔它们.例如:[1+7,hello,2-2,{cost,apple,30-20},3].列表里面各元素可以是任何类型.
列表中第一个元素被称为列表头(head).假如把列表头去掉,剩下的就被称为列表尾(tail).访问列表头是一种非常高效的操作,因此基本上所有的列表处理函数都是从提取列表头开始,然后对它做一些操作,接着处理列表尾.
如果T是一个列表,那么[H|T]也是一个列表,它的头是H,尾是T.竖线(|)把列表的头与尾分隔开.[]是一个空列表.
6> ThingsToBuy = [{apples,10},{pears,6},{milk,5}].
[{apples,10},{pears,6},{milk,5}]
7> ThingsToBuy1 = [{oranges,4},{newspaper,1}|ThingsToBuy].
[{oranges,4},{newspaper,1},{apples,10},{pears,6},{milk,5}]
下面从这个列表中提取我们想要的元素,和其他情况一样,我们还是使用模式匹配操作来提取列表中的元素.[X|Y] = L (X和Y表示未绑定变量).
8> [Buy1|ThingsToBuy2] = ThingsToBuy1.
[{oranges,4},{newspaper,1},{apples,10},{pears,6},{milk,5}]
9> Buy1.
{oranges,4}
10> [Buy2,Buy3|ThingsToBuy3] = ThingsToBuy2.
[{newspaper,1},{apples,10},{pears,6},{milk,5}]
11> Buy2.
{newspaper,1}
12> Buy3.
{apples,10}
13> ThingsToBuy3.
[{pears,6},{milk,5}]
字符串
严格来说,erlang里没有字符串.要在erlang中表示字符串,可以选择一个由整数组成的列表或者一个二进制型.当字符串表示为一个整数列表时,列表里的每个元素都代表一个Unicode代码点.
字符串其实是一个整数列表,用双引号括起来的就是一个字符串.
X = [97,98,99].
"abc"
io:format("~w~n",["abc"]).
[97,98,99]
"="模式匹配符
1> {X,abc} = {123,abc}.
{123,abc}
2> X.
123
3> f().
ok
4> {X,Y,Z} = {222,def,"cat"}.
{222,def,"cat"}
5> X.
222
6> Z.
"cat"
第一节对erlang的基本东西有了一个概念性的理解.如果有错误的地方和要补充的地方,会在后续的学习中慢慢的添加进去.