Erlang基础 - 数据类型
Erlang数据类型很少,很容易掌握:
一、数值类型(整数和浮点数)
1、整数
整数大小事没有限制的,较小的整数会被存放在单个机器字长内,较大的整数会自动按需分配内存。所以根本就不存在溢出的问题。
示例:
101
-101
1234567890 * 987654321 * 999999999
另外,还可以使用2进制到36进制的整数,如:16#FF00,2#10101,36#ZZ。
还有,利用$前缀记法可以得到任意字符的数值编码(ascii/Latin-1/Unicode皆可)
如:$9,$z,$\n
2、浮点数
Erlang的浮点数采用双精度,没有单精度的说法,且浮点数不可以用.(英文句号)开头,如:.01,而erlang要求必须以数字开头,如:0.01。
3、算数运算符与位运算
+、- 和 *
其中除法分两种:/ 和 div,如:4/2 结果是 2.0,4 div 2 结果是 3,整数运算符的余数克由运算符 rem 实现,如: 15 rem 4 结果是 3。
另外还有一些用于整数位运算的运算符:N bsl K表示将整数N左移K位,bsr是右移。位逻辑运算符分别是band、bor、bxor和bnot。例如:X band (bnot Y)会再X中将Y所占用的位清零。
二、二进制串与位串
整数取值范围0~255,例:<<0,1,2,...,255>>,还可以用字符串构造二进制串,例:<<"hello", 32, "world">>
三、原子
Erlang中原子时一种仅由字符序列来标识的特殊字符串常量,因此两个原子只要具有相同的字符表示,就完全等同。但在系统内部,这些字符串存储在某张表内,并由表的下标定位,因此在运行时只要比较两个小整数就可以判断两个原子是否相等。每个原子仅占一个字长的内存。
Erlang中,原子的作用类似于java或C语言中得enum常量,区别在于无须事先声明原子,可以随意创建并随处使用。通常情况下,原子以小写字母开头,如:
ok、error、foo、undefined
若再用到其他特殊字符,就得给他们加上单引号,如:
‘¥%#*!’
‘Blanks and Capitals can be quoted'
你应该把原子当做一类特殊的标签,而不是普通的字符串。他们的长度上限是255个字符,在单个系统中原子的总数也是有上限的:目前是一百多万个,准确地说是1048576个。一般来说这个上限已经足够大了,但对于长期运行的系统,你应该避免动态生成诸如:'x_4711','x_4712'这类的全局唯一的原子。原子已经创建,即便不再使用也永远不会被清除,除非系统重启。
四、元组
元组是定长有序序列,元组用大括号来表示,如:
{1, 2, 3}
{one, two, three, four}
{from, "Russia", "with love"}
{complex, {nested, "structure", {here}}}
正如C中得struct或Java中的对象一样,元组是在erlang中构造符合数据结构或一次性返回多个结果值的主要手段;只是元组的元素项没有名称,只有编号。访问元组中得元素是常熟时间复杂度的操作,跟在Java中访问数组元素一样快速和安全。借助后续即将介绍的记录语法,你可以给元组中得元素项命名,这样就不用直接使用下标了。
另外,通过模式匹配还可以简单地用变量来引用元组的不同部分,因此很少需要直接用下标来访问元素项。
五、列表
列表是Erlang各种数据类型中得真正的主力军。例:
[]
[1, 2, 3]
[one, two, three]
[{tomorrow, "buy cheese"},
{soon, "fix trap door"},
{later, "repair moon rocket"}]
添加列表,如:
[5, 4, 3 | [2, 1]] 这将得到 [5, 4, 3, 2, 1]
[1, 2, 3, 4] ++ [5, 6, 7, 8] 这将得到 [1, 2, 3, 4, 5, 6, 7, 8]。
六、字符串
Erlang中的双引号字符串实际上就事列表,如:
“abcd"
"Hello!"
" \t\r\n"
七、唯一标识符:pid、端口和引用
1、pid (进程标识符)
可以通过self()得到当前进程的pid,打印格式:<0.35.0>
2、端口标识符
端口和进程差不多,只是他还可以与外界通信,端口的打印格式:#Port<0.472>
3、引用
这种数据类型中的第三种数据类型就是引用,常备称作ref。可由make_ref()函数生成,打印格式为#Ref<0.0.0.39>。引用常被用作各种要求保证唯一性的一次性标签或cookie。
八、fun函数
Erlang被称作函数式语言,这类语言的一个显著特征就是可以像处理数据一样处理函数 -- 也就是说,函数可以成为别的函数的输入,也可以成为别的函数的求职结果,还可以把函数存在数据结构中供后续使用,诸如此类。当然,还要提供函数调用机制。在Erlang中,这种将函数包装成数据的对象称作fun函数。