erlang数据类型(1)

         变量:erlang的变量是一次性赋值变量,=是一个模式匹配操作符。 Lhs = Rhs的意思是,计算右侧的值,将结果和左侧的模式相匹配。


         原子(atom):仅由字符序列标识,被用于表示常量值,全局性的,以小写字母开头,可放入' '内(此时大写字母开头的将解释成原子),系统将之放在一个atom表中。唯一的运算是比较,比较时间是常量的。erlang中模块名和方法名都是原子。Erlang atom不参与垃圾回收,一旦创建就不会被移除掉;一旦超出atom的数量限制(默认是1048576) VM就会终止掉。list_to_existing_atom可以一定程度上缓解创建重复atom的内存消耗,因为该函数检查atom表中是否存在一个atom(参数中的),若已经存在不会创建新的atom。


         元组(tuple):表示一个匿名的实体,用于保存固定数量的元素,类似于C中的struct。提取值可以使用模式匹配。几个内置函数:erlang:tuple_size(Tuple) ->Length.Tuple 的长度。erlang:element(i,Tuple) -> atom(). 选择第i个位置的元素。erlang:setelement(i,Tuple,Aton) ->Tuple2, 修改Tuple中的第i个位置的值为Aton。

在堆中以Array形式存储,有字段表示元组大小,且栈中有一个指针指向这块堆空间。其中一种模式匹配对{erlang, number, 1}, 模式{$1, $2, '_'}将得到{erlnag, number}.


         列表(list):用来存放任意数量的事物。列表的规范的使用方式是只在头部添加或者删除元素(更高效率)。推导,速构,形式类似于[X || X <- [list], ...(条件)。

几个函数:lists : map(F,L)对L中每个元素调用F函数,返回元素结果组成的列表,lists:filter(F,L)返回满足F的元素组成的列表。lists:append(ListB, ListA)操作,先复制ListB,遍历ListB,找到表的尾部元素,将其指向下一个元素的指针指向ListA的第一个元素地址。因此,最好将长的列表追加到短的列表上。lists:foldl(Fun, Acc0, List) -> Acc1,对每个List中的元素应用Fun,然后累加器初始值为Acc0,结果累加起来后返回。lists:foldr(Fun, Acc0, List)只是作用参数的方向与前者相反,但是非尾递归实现,不建议长列表使用。

在堆中以链表形式存在,栈中一个指针指向列表第一个元素,要得到大小只能遍历,时间复杂度为O(N)。


         字符串:erlang里表示字符串,可以选择一个由整数组成的列表或者二进制型。用双引号围起来一串字符串如"hello",这其实是一个列表的简写。


         term:可以是任何一种erlang数据结构。


         记录(record):元组的一种,可以给元组各个元素一个关联的名称,然后通过名称来指向它们。同时,支持记录里面嵌套记录。 -record(man , { name, age=0, school}). M=#man{}. 创建一个新的记录,字段使用默认值birthday(M) when is_record(M,man )-> M#man{age=M#man.age +1}.  创建一个M的副本,其中副本的字段得到改变。

#todo{who = W, text = Text} = X2. 将X2中的who绑定到W,text绑定到Text。(记录字段提取)


         映射组(map): ErlangR17版本后使用。写法:#{ Key1 Op Val1, Key2 Op Val2}。一种关联式的键值存储,其中键可以是任意的Erlang的数据类型,两种符号=>用于首次的键值对创建,不建议用来修改;:=用于修改键的值,首先查找键,不存在则报错。映射组排序时先比大小,之后按键排序。一个映射组内部是一个有序的集合,按键来排序。


         Fun函数:函数式编程语言表示函数可以被用作其他函数的参数,也可以返回函数。引用当前或者外部模块的函数: fun LocalFunc/Arity, funMod:RemoteFunc/Arity。

进程字典:使用之会使得代码不是无副作用的,容易引入 bug,使得调试困难。但用于保存一次性写入的变量是可以的。一般不建议使用。

缺点:1.程序行为无法通过代码看出。2.使得进程间迁移任务不可能3.因为是一个进程私有的,因此执行的任务需要进程字典时只能用这个单进程。


         二进制型:为了简化网络编程。用于保存大批量的无结构数据内容,位数是8的倍数,称之为binary,否则,称之为bitstring。其中,位语法表达式构造二进制型或位串:<<E1, E2, …>>,其中单个元素Ei的形式有四种。Ei = Value | Value:Size| Value/TypeSpecifierList | Value:Size/TypeSpecifierList。其中有位串速构,类似于列表推导的用法。具体使用,还是要看网上很多例子来掌握。


         宏定义:宏定义如下:-define(Const, Replacement). -define(Func(Var1,...,VarN),Replacement).

使用时需要加上?:?Const,?Func(Arg1,...,ArgN),它们将在编译时扩展。

其中预定义宏:

?MODULE表示当前模块的名字

?MODULE_STRING string形式的

?FILE 当前模块的文件名

?LINE 当前行号

?MACHINE 机器名字

?FUNCTION_NAME当前函数的名字

?FUNCTION_ARITY 当前函数参数个数


参考网站:

https://www.cnblogs.com/me-sa/archive/2012/01/04/erlang0028.html

http://ju.outofmemory.cn/entry/112734

http://www.cnblogs.com/zhongwencool/p/erlang_binary.html

http://www.cnblogs.com/me-sa/archive/2011/12/25/erlang0024.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值