Erlang开发笔记之数据类型

来源:互联网 发布:少女韩版书包淘宝 编辑:程序博客网 时间:2024/04/28 18:03

1、变量与模式匹配

首先,要知道两点。第一,erlang是一种并发性语言,天生支持并发和分布式。第二,erlang是函数式编程。

基于这两点,erlang在语法上与C/C++/JAVA等语言会有很大的区别。

(1)erlang也有变量,但它的变量更像C++中的指向常量的常量指针,它指向内在中的一个固定区域,这个区域里面的值是不可变的,因此erlang变量只能赋一次值。

(2)erlang的赋值运算符也是=,但这个赋值运算符的真正含义其实也不是赋值,而是做模式匹配。模式匹配的意思是对=左右两边的表达式进行比较,如果相等则返回表达式的值,如果不等直接报错,从这点看,erlang的=更像C语言中的==。

(3)知道了模式匹配是做相等比较,比如在shell中输入3=3.结果会返回3。如果输入3=4.则会直接报错。那如果表达式的一方是变量呢?这里就涉及变量的绑定了,变量绑定其实就是给变量赋值,因为变量只能赋一次值,因此这个赋值过程其实就是给变量绑定一个值,绑定之后变量的值就永远是这个了,除非手动清空。变量分为两种,自由变量和绑定变量。自由变量就是还没有绑定值的变量,这时它与任何表达式做模式匹配都会成功并将表达式的值绑定给该变量。绑定变量就是已经绑定值的变量,这时做模式匹配只有另一个表达式的值与变量的值相等才会成功。

(4)变量以大写字母开头,后面带大小写字母,数字或下划线。

(5)erlang语句以.结束。

1> 3=3.32> 3.14=3.1.** exception error: no match of right hand side value 3.13> X=10.104> X.105> X=3+7.106> X=9.** exception error: no match of right hand side value 9


2、整数和浮点数

整数和浮点数作为直接量直接使用,可做算术运算,模式匹配或直接输出。这是注意整数的除法,使用/作除法的结果是浮点数,如果要作整除使用div和rem,div返回商,rem返回余数。

13> 10/3.3.333333333333333514> 10 div 3.315> 10 rem 3.116> Y=20/3.6.66666666666666717> Z=30 div 3.1018> Y=Z.** exception error: no match of right hand side value 10


3、原子

原子类似于C语言的宏,用一个符号来表示一个值。既然erlang的变量已经是只有赋一次值的“常量”了,为什么还要有原子呢?因为原子是不用赋值的直接量,类似整数,原子的值就是它自己。比如hello的值就是hello,就像3的值就是3一样。这个hello的类型还是字符串,也是其它数据类型,它就是它自己。这点很重要,这使得我们可以任意拓展直接量,而不仅限于数字。

原子以小写字母开头,后面带大小写字母,数字,下划线或邮件符号@。

19> hello.hello20> A=hello.hello21> A.hello22> B=A.hello


4、元组

到此,erlang的简单数据类型就完了,看起来非常简单和单薄,就整数、浮点数外加一个原子。你可能会好奇,字符类型呢,布尔类型呢?其实想想,整型、浮点型也没有,上面提到的是整数和浮点数。所以,我们可以简单地认为erlang中的基本数据类型都是直接量,根本不存在类型这一说法。这是因为erlang是函数式编程,注重的是表达式的值,而还是所谓的变量,变量只是指向一个值而已,数据类型只是表征这个值是属于哪种类型,就像数学中的整数,小数和非数字(包括true和false这两个直接量)。

好了,下面该讲元组了。

元组类似C语言的结构体,是一种复合的数据类型。元组使用{}表示,每个字段之间用,隔开。

元组的创建很简单,直接用一对花括号括起一些字段就是一个元组了。如果想把元组绑定给变量,进行模式匹配即可。

如果想提取元组中了字段,也是进行模式匹配即可。请看下面例子

26> P={point,10,20}.{point,10,20}27> {_,X,Y}=P.{point,10,20}28> X.1029> Y.2030> P1={P,3.14,size}.{{point,10,20},3.14,size}


元组里面的_是一个占符,称为匿名变量,提取元组的字段时,对于我们不关心的字段,可用匿名变量存储。

元组的字段除了上面讲的三种基本数据类型之外,也可以是元组或后面要讲的列表或其它。

5、列表

列表与其它语言中的列表相似,是一个不定义的线性结构。列表使用[]表示,每个字段之间也是用,隔开。[]表示一个空列表。列表有列表头和列表尾,列表的第一个字段就是列表头,剩下的部分则为列表尾。可以使用模式匹配取得列表的头和尾。可以使用[E1,E2,...,En|T]的方式在列表T前面插入n个元素,形成一个新的列表。注意区分和[E1,E2,...,En,T]的区别,请看下面例子

38> T=[1,2,hello].[1,2,hello]39> G=[3.14,100,T].[3.14,100,[1,2,hello]]40> S=[3.14,100|T].[3.14,100,1,2,hello]41> G=S.** exception error: no match of right hand side value [3.14,100,1,2,hello]


6、字符串

严格来讲,erlang并没有字符串(连字符都没有,哪来的字符串),这里说的字符串其实就是一个整数列表,只不过我们在shell下打印一个整数列表时,如果列表的所有字段都是可打印字符,则会以字符串的形式打印。

如果我们要一个字符对应的整数,使用$符即可,比如$s=115.

erlang字符串用双引号括起来。

46> Name="Hello"."Hello"47> Name."Hello"48> [A,B,C|D]=Name."Hello"49> A.7250> B.10151> D."lo"52> [105,115]52> ."is"53> I=$s.11554> [I-32,$u,$r,$p,$r,$i,54> $s,$e]."Surprise"

0 0
原创粉丝点击