[Erlang开发之路]回顾总结一:Erlang的变量类型
2019-07-25 本文已影响0人
循环不计次
开篇语
看完了《Erlang程序设计》之后,我觉得我还是没有系统性地掌握好Erlang这一门语言,所以有必要去回过头来把我所学到,所认知到的东西给总结下来,而总结内容会比之前记录的内容精简,因为总结下来的会是学习这一门语言中的核心:变量类型、数据结构、特性、以及特属Erlang的OTP框架等
一、变量类型
- 原子类型 atom()
1、这一种变量类型放在C++里就和enum一样,能对这种类型的变量的操作只能进行比较,而不能进行任何的处理操作,比如分隔,匹配等等,而且在Erlang中模块名和方法名都是atom。
2、那么atom的格式是怎么样的呢?只要你是小写字母开头(不包含数字),你都是atom类型的变量。
3、一个atom一旦被创建,就不会被释放掉,因为它不参与Erlang的垃圾回收,而且一个Erlang虚拟机中有atom的数量限制,一旦超过就会耗光内存,如果你害怕一个新的原子类型被创建,你可以使用list_to_existing_atom(atom)来防止,用这个函数来使用原子类型的变量必须是这个原子之前已经创建了。
- 数值类型 Number()
1.支持数字和浮点型。integer()和float()
2.浮点可表示为2.3,2.3e3,2.3e-3等类型。
3.支持用a就是97
4.支持进行2-36进制数的表示,如3#11表示4.
- 元组类型 Tuple()
类似于Object,不同的是,它的长度是固定的,形式如下:{Term1,...,TermN}可以用模式匹配的方式轻松的获取Tuple中的某一值,而模式匹配的时候不能像列表一样用|分隔开,因为长度是固定的,通过这个特性也可以拿去区别开同名函数
- 列表类型 List
1、形式如下:[Term1,...,TermN]
2、可以用|来连接Head和Tail,其中Head可以是任意Term,而Tail必须是List。如[1|2]虽然能正常执行,但是却不能被length等内置函数使用。
3、需要注意的是:length(1|[2,3])为3,但是length([1,2]|3)为2
4、可以用模式匹配加递归的方式依次获取List的元素。
5、这里有一个特性:列表推导,可以通过列表推导去执行查询式的操作,去形成一个新的列表
NewList = [Expression || GeneratorExp1, GeneratorExp2, ..., GeneratorExpN, Condition1, Condition2, ... ConditionM]
关于列表还要注意的是:有几个函数空列表需要注意,否则报错:
a. 最大值 lists:max(),
b.最小值 lists:min(),
c.[Head|Tail]模式匹配
除非本身兼容空列表的函数,譬如列表推导【F(X)||X<-List】, lists:foldl(), lists:map() 等等,可以不考虑空列表情况。
- 位串Bit Strings与二进制型binary
1、Bit Strings代表无类型的内存区域,表现形式为<<E1,...,En>>。
2、其中Ei的形式为Value 或 Value:Size 或 Value/TypeSpecifierList 或 Value:Size/TypeSpecifierList,Size则是这段位的长度
3、TypeSpecifierList的形式是End-Sign-Type-Unit.
(a).其中Type可以是integer(default),float,binary,bytes,bitstring,bits,utf8,utf16,utf32形式的
(b).Sign可以是signed或者unsigned(default)
(c).Unit取值范围是1-256,这个数值用来扩展内存区域,将原来的区域扩展Size(IntegerLiteral-1)位,默认值为1,即不进行扩展。int、float\bitstring的Unit默认是1,binary是8,UTF类型无需提供,写法是Unit:1...256
(d).End可以是big(default),little,native,意义就是机器的字节顺序,native是根据CPU确定,big是网络字节序
4.可以用模式匹配的方式轻松的获取内存区域中某一位置的值,用Erlang来处理数据很方便,但是不推荐使用Erlang来处理大量的数据,因为Erlang在数据处理方面比C++慢
(a).List推导出Binary
<< <<Bit * 2:8>>|| Bit<-[1,2,3,4] >>
(b).Binary推导出List
[2Bit || <<Bit>> <- <<1,2,3,4>> ]
- 函数 Fun
变量也可以来保存一个函数,有两种方式可以去保存一个函数到变量里:
1.匿名函数
Function=fun()->
%to_something()
end.
2.已定义的函数
Function=Mod:FunctionName/Arity
函数变量=模块名:函数名/元数(参数个数)
- 字符串 String
String由双引号和字符串来表示,其实质是List。如"hello"等价于[e,l,$o].两个相邻的字符串将组合成一个字符串,即"he" "llo"等价于"hello"。也可以用Binary来表示字符串。
说实话我不是很确定这是不是一种变量类型,因为字符串的表示方法有很多种,binary可以去表示(当bit都是ascii范围内时),List也可以去表示字符串
- 记录 Record
Record类似于Struct,Record表达式会在编译时转为tuple表达式。
创建记录:
-record(RecordName,{
Field[=defaultValue,
.
.
.
FieldN[=defaultValue]
}).
读取记录:
rr(RecordFile).
在元组上套记录:
Var=#RecordName{Field=Value,...,FieldN=Value}.
有默认值的可以不赋值
访问FieldN:
Var2=Var#RecordName.FieldN
更新FieldN:
Var#RecordName{Field1=Value,...,FieldN=Value}
如果Value不改变可以不在里面赋值
- Boolean 这种类型不存在额
Boolean实际上是用原子true和false来表示的,
不能和C++中一样,当成数字来用,要牢记,在Erlang中,它是Atom值。
- 其他不常用的类型
比如Port()、Ref、Pid等等