Erlang数据结构及流程控制

数据结构反映一个数据的内部构成。

数据的逻辑结构是指成分数据的逻辑关系,可分为单一类型和复合类型。

单一类型
数值
整数 - 理论上允许是任意长度(只要不超过机器限制)
浮点数 64bit
原子 - 用单引号括起来

复合类型 - 可无限嵌套
元组 - 不适用于递推

列表 - 可按序访问(用|),适用于递推
字符串 - 是一种特殊的列表,用双引号括起来


逻辑数据的赋值,由变量绑定实现。
逻辑数据的抽取,由模式匹配实现。

模式匹配中常用到占位变量: _ 和 _Var (区别是后者是实际变量,不能重复定义)

数据的物理结构是指数据在计算机内部的存储形式。
二进制流 - 用<< >>括起来,流不可以进行模式匹配这种复杂操作。

Term - 可以表示任何类型的Erlang数据

tuple_to_list, list_to_tuple只进行复合数据最外层的类型转换,下层嵌套结构不变。

记录record
记录描述了元组的最外层信息,用于批量创建元组。记录可以定义在记录文件中,也可以定义在模块文件中,一个记录文件(.hrl)可以包含多个记录。
-record(myrec,{
%% the next is structure of record
k1 = song,
k2 = feng
}).
-record(myrec2,{
%% the next is structure of record
k1 = song,
k2 = feng,
a1 = {china, shanghai, pudong}
}).

代码中常用-include_lib(File)来包含记录信息

shell中可以用rr(File), rr(File, Rec), rr(File, Rec, Opt)等来读取记录信息

二进制数 形如 <<I1,I2,...>>

list_to_binary(List)
list(必须是一个整数型List!)转成的是一个普通的二进制数据。

term_to_binary(Term)
Term可以是任何的Erlang数据(甚至是二进制数据)
binary_to_term(Bin)
Bin只能是由Term转换成的binary

由Term数据转成的二进制数据,是一种特殊的所谓“外部数据格式”存储的TLV结构(V可无限嵌套TLV')。

Term数据: <<131,T>> <L> (子数据的个数) +
原子: <<100,0>> <L> +
字符串: <<107,0>> <L> +
整数: 保持不变
浮点数: <<99>> + (ASCII码表示,后面补'0')
元组:<<104>> <L> +
列表:<<107,0>> <L> +
T可以是 上述子类型任何一种(整数是97)

begin..end 块
end只可用于函数体内

Erlang的模块化是通过模块(.erl)来组织的
运行一个模块,首先要编译它,生成相应的二进制文件(.beam)

匿名函数fun,就是lamba

高阶函数 - 允许传入,使用,或返回匿名函数的函数。

下划线变量 _Var 比 _更具可读性,但注意避免重复定义。

比较表达式:
> =< =:=
< >= =/=

匿名函数fun的参数可以采用模式匹配
F=
fun
(5,Y) -> 10*Y;
(X,2) -> 3*X;
(X,Y) -> 3*X + 10*Y //兜底
end.

更强的一种做法是用断言guard
when只可出现一次,但其可以使用与(逗号),或(分号)等关系,但不能使用自定义的关系表达式(难以保证其可以正确work)。
F=
fun (X,Y) when X>3; Y<100, Y>10
-> X + Y
end.


函数体内的流程控制可以使用if/case表达式
if
Bool1 -> Expr1;
Bool2 -> Expr2;
true -> Expr3 //兜底
end

case Expr of
Val1 -> Expr1;
Val2 -> Expr2;
_ -> Expr3 //兜底
end

Erlang异常
有三类: exit, error, throw.
exit是发生于系统(二进制代码)内部
error和exit区别不大,脱胎于exit,不同的一点是error会返回栈跟踪,而exit无。往往被用户用来截留exit信号后作些改头换面
throw发生于用户源代码,用于希望编程人员来处理的某类异常

try
throw({}),
erlang:error({}),
exit({})
catch
throw:X -> {};
error:X -> {};
exit:X -> {}
end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值