数据结构反映一个数据的内部构成。
数据的逻辑结构是指成分数据的逻辑关系,可分为单一类型和复合类型。
单一类型
数值
整数 - 理论上允许是任意长度(只要不超过机器限制)
浮点数 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
数据的逻辑结构是指成分数据的逻辑关系,可分为单一类型和复合类型。
单一类型
数值
整数 - 理论上允许是任意长度(只要不超过机器限制)
浮点数 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