数据结构反映一个数据的内部构成。
数据的逻辑结构是指成分数据的逻辑关系,可分为单一类型和复合类型。
单一类型
数值
整数 - 理论上允许是任意长度(只要不超过机器限制)
浮点数 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
分享到:
相关推荐
Erlang是函数式编程语言的代表之一,它鼓励使用不可变数据结构和纯函数。在Erlang中,函数是第一类公民,可以作为参数传递,也可以作为返回值。函数式编程的特性使Erlang代码更易于理解和调试,因为它们通常没有副...
- **数据结构的使用**:Erlang的列表、元组、映射等数据结构在源码中的应用。 - **模式匹配和函数定义**:了解如何通过模式匹配来简化代码,以及函数多态性的实现。 - **OTP库的使用**:观察源码中是如何利用OTP提供...
【Erlang程序设计(第2版)】是由Erlang之父Joe Armstrong撰写的一本经典著作,专注于介绍Erlang编程语言在并发、分布式和容错系统中的应用。本书适用于初学者和有一定经验的Erlang程序员。作者在书中讨论了如何利用...
这本书的作者Fred Hébert是一位在一线拥有丰富实战经验的工程师,他通过轻松幽默的文风和清晰的讲解,向读者介绍了Erlang的模块、函数、类型、递归、错误处理、数据结构、并行编程、多处理、事件处理以及Erlang的...
1. **Erlang语法**:涵盖基本的变量、数据类型(如原子、列表、元组和二进制)、控制结构(如case表达式和if语句)以及函数定义。 2. **函数式编程概念**:Erlang是纯函数式语言,书中可能会介绍函数式编程的基本...
理解分布式协议(dist协议)的格式和全局数据结构(如ETS、Dets)的应用,有助于开发健壮的分布式应用。 #### 6. Erlang的BEAM模拟器 BEAM是Erlang的字节码解释器,模拟器可以用于开发阶段模拟运行和测试Erlang代码...
它鼓励使用不可变数据结构和纯函数,这有助于编写无副作用的代码,使得程序更易于理解和测试。同时,Erlang支持模式匹配,这是一种强大的工具,可以在函数定义中匹配和解构复杂的数据结构。 “Erlang中文基础教程”...
8. **性能优化**:Erlang的性能可以通过合理设计数据结构、减少不必要的计算和通信开销来优化。对于大型游戏,内存管理、数据库查询优化和并发控制都是性能提升的关键点。 9. **版本控制与部署**:开发过程中,版本...
- **减少内存消耗**: 通过优化数据结构和算法来降低内存占用。 - **提升响应速度**: 针对瓶颈进行针对性优化,如使用更高效的并发模型。 #### 3. 编码最佳实践 - **模块化**: 将代码组织成多个小而专注的模块,...
- **灵活的数据结构**:`gproc`不仅支持简单的键值对,还支持列表、树形结构等复杂数据组织方式。 2. **gproc与ETS的结合** - **全局ETS表**:`gproc`扩展了ETS的功能,创建了全局可见的ETS表,这些表可以被整个...
Erlang提供了丰富的内置函数,这些函数覆盖了从简单的数值计算到复杂的数据结构操作的各种功能。掌握这些内置函数对于高效地编写Erlang程序至关重要。 **1.5 并发** 并发是Erlang最引人注目的特性之一。Erlang的...
设计合理的数据结构和消息处理机制是提升服务器性能的关键。 5. **并发处理**:Erlang的轻量级进程使得并发处理变得简单。理解如何使用进程来处理每个客户端连接,以及如何通过消息传递进行进程间的通信。 6. **...
1. **核心语言和框架基础:**第二版涵盖了Erlang的核心概念和技术细节,包括语法、数据类型、流程控制、函数式编程等基础知识。 2. **社区项目介绍:**书中还详细介绍了Erlang社区中重要的开源项目,如构建工具rebar...
5. **高效的数据结构**:Erlang的列表、二元组和散列表等数据结构提供了高效的操作,便于快速处理游戏中的各种数据,如玩家信息、游戏状态等。 6. **OTP(Open Telecom Platform)框架**:OTP提供了一套标准库和...
4. **模式匹配**:Erlang中的模式匹配是其语法的一大特色,用于在函数定义中解构复杂的数据结构。 5. **错误处理**:讲解Erlang的异常处理机制,如try-catch-finally语句。 6. **模式和类型**:涵盖模式匹配和类型...
6. **数据结构与模式匹配**:Erlang的元组(tuple)、列表(list)和二进制数据(binary)等数据结构在源码中会得到广泛运用。模式匹配用于解构数据和条件分支,使得代码更简洁。 7. **网络编程**:OpenPoker作为...
- **模式匹配**:模式匹配是Erlang的一个重要特性,它允许开发者以一种声明性的方式来处理数据结构,例如在函数定义中使用模式匹配来提取数据。 #### 2. 进程与消息传递 - **进程创建**:在Erlang中,可以通过`...
参数化模块的引入不仅可以帮助开发者避免常见的错误,如通过函数闭包引入的意外闭包状态,而且有助于开发者以更清晰和结构化的方式构建Erlang应用程序。通过这种扩展,Erlang继续保持了其作为构建大型并发和分布式...
函数式编程的特点包括无副作用、纯函数以及不可变的数据结构等。 ##### 11. 动态类型 Erlang采用动态类型系统,变量的类型在运行时确定。这种灵活性使得开发人员可以快速编写和测试代码,但同时也需要程序员确保...