Erlang --- 基本概念

在Erlang中有一些基本的概念,需要理清:

1、原子

在Erlang中,原子是一种仅由字符序列来标识的特殊字符串常量,因此两个原子只要具有相同的字符表示,就完全等同。使用原子,无须事先说明,你可以随意创建并随处使用各种新的原子。

通常情况下,原子以小写字母开头,如ok,error,在首字母之后,可以使用大写字母、数字、下划线和@,如果还要用到其他字符,你就得给它们加上单引号(在shell中实验发现 a == 'a')。

你应该把原子当做一类特殊的标签,而不是普通的字符串,它们的长度上限是255个字符,在单个系统中原子的总数也有一个上限:目前是一百多万(准确的说是1048576),原子一经创建,即使不再使用也永远不会被清除,除非系统重启,在程序中能不使用原子就不要用原子,因为原子很容易成为黑客攻击的目标。

2、变量

Erlang变量最显著的特点就在于变量名必须以大写字母开头!(以小写字母开头的是原子),变量名中的单词以驼峰体隔开,这是Erlang变量的标准命名风格,如AddItem、RoleId,变量名也可以以下划线开头。这种情况下,按常规第二个字符通常应该是大写字母:_Error,这两种命名方式有一点小小的功能区别:赋值之后一直未被使用的变量往往会触发编译警告。这个机制可以帮我们发现大量低级错误,所以不要关闭这个警告,然而,如果使用某个变量的目的仅在于提高程序的可读性,你便可以在变量名前加上一个下划线,这样一来即便这些变量不被使用,编译器也不会报警,同时,所有未被使用的变量都会被优化掉,不会带来额外的成本,你就可以毫无顾虑的以改善可读性为目的的使用它们标注程序。

Erlang的变量被严格地限定为只能接受单次赋值,也就是说,变量一旦被赋值,变量就被绑定到某个值上,该变量在其整个作用域(即变量在程序中生效的范围)内便一直持有这个值。在程序的不同位置可以重复使用同一变量名,但仅限于互不覆盖的多个不同的作用域内,所指的当然也是不同的变量。=运算符就是模式匹配。

3、列表和字符串

我们用方括号表示列表,如[1,2,3],所以列表就是零个或多个Erlang项式(项式本身也可以是列表)的序列。如果添加列表新元素,如[5,4,3 | [2,1] ],新元素应从左侧添加,另外,你也可以用++运算符向列表追加任意长度的列表,例如[1,2,3] ++ [4,5,6],最后得到[1,2,3,4,5,6],其过程也是一样的,新元素从左侧添加,也就是说,左侧列表的长度决定了++运算符的耗时。

Erlang中双引号字符串实际上就是列表,其元素就是该字符串中各字符的数值编码所对应的整数。如"abcd",与它等价的列表是[97,98,99,100],还可以写作[$a,$b,$c,$d],Erlang shell为了区别对待字符串和普通列表,会检查列表的元素是否全部为可打印字符,如果是,就打印成双引号字符串,否则就打印为整数列表。

4、元组和记录

元组是其他Erlang项式的定长有序序列,元组用大括号来标识,如{1,2,3},这些元素可以是同一类型,也可以是不用的数据类型;这些元素本身也可以是元组或任意其他数据类型。记录本质上就是标记元组,但避免了使用元组时增减字段所带来的麻烦以及必须记住各个字段在元组中的顺序的问题。

使用记录时的第一要务就是写下记录声明,如-record(customer,{name = "hua",address,phone}).该声明告诉编译器你将要使用一个四元组(3个字段加上标记),其中第一个元素总是原子customer。其他字段的顺序与记录声明中一致,因为name总是第二个字段。

创建记录时一定要在记录名之前加上#,这样编译器才会将之与记录声明相匹配。如#customer{},在{...}之内,你可以选择任意字段按任意顺序进行赋值(一个都不选也行),编译器会按声明中的顺序为他们排序,未赋值的那些字段将被置为默认值,即原子原子undefined,除非你在声明中另行制定了默认值。

获取记录的数值,如Name = R#customer.name;更改记录的数值,如R#customer{name = "zhen",address = "hai"}。

对于仅用于单个模块中的记录,一般直接将记录声明写在模块的顶部,和导出声明及其他类似声明一起放在模块首部。然后如果要在多个模块中使用同一个记录声明,那么你应该将这些需要共享的定义放在独立的头文件中,供所有需要这些定义的模块读取。这一切都有预处理器负责处理。

 

posted @ 2016-04-27 15:59  孔夫子耍大刀  阅读(527)  评论(0编辑  收藏  举报