erlang 的数据类型

发表于:,更新于:,By Minary
大纲
  1. 1. 数值与算数运算
  2. 2. 原子
  3. 3. 元组
  4. 4. 列表
  5. 5. 字符串
  6. 6. 项式比较
  7. 7. 小于等于/大于等于
  8. 8. 相等比较
  9. 9. 总结

随手向[野生凯迪]借了本书《Erlang/OTP并发编程实战》。
所以说, 开始学习 erlang 了(闲的时候)。嘛, 笔记模式开启。

数值与算数运算

  • 整数 (erlang 中的整数 大小没有限制 , 不用担心溢出或者截断)

    • 较小的会被存在单个机器字长内, 处理较大的整数(bignum)时,会自动分配内存。
    • 可以用 $ 前缀来得到任何字符的数值编码。例如($1, $?, $\n)
  • 浮点数

    • 浮点数采用64位IEEE 754-1985 格式 (双精度)。
    • 不允许以小数点开头, 例如 .12 必须写成 0.12
    • Erlang没有单精度浮点数。
  • 算数运算与位运算

    • 加减乘和常见的语言没什么区别。
    • 除法有两种表达方式。 用 ‘ / ‘,它总是返回浮点数; 用’ div ‘, 则只会返回整数。 例如:5 / 3 返回 1.6666666666666667 , 5 div 3 返回 1 。
    • 整数求余(rem): 15 rem 4 ,返回 3 。
    • 位运算: N bsl K 代表将整数 N 左移 K
      位, bsr 是右移。 位运算逻辑运算符分别为(band, bor, bxor, bnot)。
  • 构造二进制串的基本语法: <<10, "say", "hello">>.

原子

  • 定义: 在Erlang中, 原子 是一种仅由字符序列来标识的特殊字符串常量, 因此两个原子只要具有相同的字符表示, 就完全等同。

  • 作用类似与 JAVA 或 C 中的 enum 常量:用作标签。

  • 通常为小写,在首字母小写后可以使用大写字母,数字,下划线和 @ 。(例如: ok, error, foo, undefined, routue66)

  • 原子一旦被创建, 即使不再使用也永远不会被清除, 除非系统重启。

元组

  • 定义: 元组(或n元组, 即三元组, 四元组等的一般表达式)是其他 Erlang 项式的 定长有序序列 。元组用大括号表示为:{1, 2, 3}, {a, {b, c, d}}, {“aa”, “bb”}。

  • Erlang的一个标准约定是用原子作为第一个元素来标记元组数据的类别。例如 {size, 4}, {position, 5, 2}。这称为 标记元组

  • 标准库中的模块实现了一些更为复杂的 抽象数据类型 , 如数组,集合,字典(即关联数组或者哈希表)等;但在底层,他们大都是采用各种手段基于元组实现的。

列表

元组针对的是定长序列。 要处理变长序列, 就需要用到列表了。

  • 列表可用于存放任意多项式。 例如: [], [1, 2, 3], [one, two], [{1, 2},{3, 3}]

  • 添加列表元素

    • 在现有列表中创建一个新的列表, 并使原列表成为新列表的一部分。需要用到 | 。例如: [1 | []], [1 | [3, 2]], [1, 2 | [3, 4, 5]]
    • 另外还可以用 ++ 运算符来操作[1, 2, 3, 4, 5] ++ [6, 7] , 它其实就是执行了[1, 2, 3, 4, 5 | [6]][1, 2, 3, 4, 5, 6 | [7]]

字符串

  • Erlang中的双引号字符实际上就是列表, 其元素就是该字符中个字符的数值编码所对应的整数。例如(下面三组是等价的):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
"abcd"
"hello"
" \t\r\n"
""

---

[97, 98, 99, 100]
[72, 101, 108, 108, 111, 33]
[32, 9, 13, 10]
[]

---

[$a, $b, $c, $d]
[$h, $e, $l, $l, $o]
[$\ ,$\t\, $r, $\n]
[]
  • 字符串就是列表,所以之前能处理列表的方法一样也适用于字符串。

项式比较

  • Erlang 的各种数据类型有一个共同点: 它们都可以通过内置的 < , > 和 == 运算符来进行比较和排序。
    • 常规: 1 < 2 以及 3.14 > 3等, 原子、字符串(以及其他各种列表)和元组则按字典序排序。例如: 'abc' < 'abba', [1, 2, 2] > [1, 2, 1], 以及{a,b} < {a, c}
    • 不同类型之间的排序规则:42 < 'aa', [1, 2, 3] > {1, 2, 3} 以及 'abc' < "abc"。更准确的说, 数值<原子<元组<列表。

小于等于/大于等于

  • Erlang 的小于等于不写成 <= ,原因在于这看起来太像一个向左指的箭头。取而代之, 小于等于写作 =< ,大于等于还是一样 >=

相等比较

  • Erlang 有两种比较运算符:
    • 完全相等: =:=, 例如 10 =:= 10 返回true, 1 =:= 1.0 返回 false ;不完全相等: =/=, 例如 1 =/=2 返回true, 1 =/= 1.0 返回 true 。
    • 算数相等运算符: ==, 必要时它会将整数强制转换成浮点数再进行比较。 因此 2 == 2.0 返回 true ; 算数不等写作 /= ,例如 2 /= 2.0 返回 false。

总结

今天就这样了, 到现在为止觉得 erlang 还是一门挺好玩的语言。