Erlang 数据类型
1、数值(整数和浮点数)
Erlang中整数的大小没有限制(唯一的限制就是物理内存的大小),运算时整数和浮点数会自动进行类型转换,因此用不上显式强制类型转换。
使用数字0~9和字母A~Z/a~z 表示从2到36进制的数。
16#FFFF 十六进制的数
2#10010 二进制的数
36#zz 三十六进制的数
可用$前缀记法得到任意字符的ASCII码。
$6
$D
$?
浮点数使用64位IEEE 754-1985格式(双精度)。没有单精度浮点数。
记法与大部分编程语言相同,唯一区别是只能以数字开头,不允许使用类似.01的记法。
3.14
-0.324
6.89e-13
2、二进制串/位串
一个包含在<<...>>中的整数序列。
<<0, 1, 2, 3>>
用字符串构成二进制串。
<<"hello", 32, "world">> 返回<<"hello world">>,其中32为空格对应的ASCII码。
3、原子
在Erlang中原子用作标签。使用前不需要声明,可以随意创建并随处使用。
原子以小写字母开头,在首字母后,可以使用大写字母、数字、下划线和@。
abc55_ofgg
如果还要使用到其他字符,就要给他们加上单引号。
'$%#*!'
长度上限是255个字符。在单个系统中原子的个数上限是1048576个。
原子一经创建,即便不再使用也永远不会被清除,除非系统重启。
常用原子:
true和false用于布尔运算;
ok用于那些返回值没有任何意义、仅通过副作用发挥作用的函数;
undefined用作表示未知量的占位符。
4、元组
元组是其他Erlang项式的定长有序序列。元组可以包含零个、一个或多个元素。其中的元素可以是相同数据类型的也可以是不同数据类型的。元素本身也可以是元组。
{}
{1, 2, 3}
{one, 2, "with love"}
{complex, {need, "half", {here}}}
标记元组:
用原子作为第一个元素来标记元组数据的类别。
{size, 42}
{position, 5, 2}
5、列表(和字符串)
零个或多个Erlang项式的序列。空表[]被称为nil(它的值只占一个字长的内存)。
引用透明性:被名称所引用的值不可更改。列表可用于存放任意多个项式。
[]
[1, 2, 3]
[[1, 2, 3], [4, 5, 6]]
[{toto, "momo"}, {lili, 89}]
添加列表元素:(新元素从左侧加入)
管道符|
[ 1 | [] ] 将1添加到空列表中
[ a, b, c | [1, 2, 3] ] 返回[a,b,c,1,2,3]
运算符++
[a, b, c] ++ [1, 2, 3] 返回[a,b,c,1,2,3]
Erlang中的双引号字符串实际就是列表。
"abcd" 等价于 [97, 98, 99, 100] 或 [$a, $b, $c, $d]
在列表起始处添加一个零,可迫使shell打印出实际内容。
v(65)为"abcd" [0 | v(65)] 为 [0, 97, 98, 99, 100]
6、唯一标识符(pid、端口、引用)
pid:每个进程的唯一标识符。
pid在Erlang中是一种特殊的数据类型。
原则上在系统的生存期内所有的pid都是唯一的,但事实上,当系统运行的时间长到一定程度,前后创建的进程总数过亿时,进程的标识符就有可能被重用。
调用函数self()可查看当前进程的pid。
shell打印pid的格式为:<0.94.0>
端口:与进程的区别是,能与Erlang外界通信。
shell打印端口的格式为:#Port<0.472>
引用:用于保障唯一性的一次性标签或coockie。
shell打印引用的格式为:#Ref<0.0.0.407>
调用函数make_ref()可生成引用。
7、Fun函数
函数式语言:可以像处理数据一样处理函数。函数可以成为别的函数的输入,也可以成为别的函数的求值结果。
在Erlang中将函数包装成数据的对象称作fun函数(闭包)。