第一节 基本概念

变量

  在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的基本东西有了一个概念性的理解.如果有错误的地方和要补充的地方,会在后续的学习中慢慢的添加进去.

 

  

posted @ 2015-10-24 15:55  Malkin Sun  阅读(261)  评论(0编辑  收藏  举报