美文网首页
[Erlang开发之路]回顾总结一:Erlang的变量类型

[Erlang开发之路]回顾总结一:Erlang的变量类型

作者: 循环不计次 | 来源:发表于2019-07-25 20:33 被阅读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.支持用char来获取字符的ASCII值,比如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
    [2
    Bit || <<Bit>> <- <<1,2,3,4>> ]

  • 函数 Fun
    变量也可以来保存一个函数,有两种方式可以去保存一个函数到变量里:
    1.匿名函数
    Function=fun()->
    %to_something()
    end.

2.已定义的函数
Function=Mod:FunctionName/Arity
函数变量=模块名:函数名/元数(参数个数)


  • 字符串 String
    String由双引号和字符串来表示,其实质是List。如"hello"等价于[h,e,l,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等等

相关文章

网友评论

      本文标题:[Erlang开发之路]回顾总结一:Erlang的变量类型

      本文链接:https://www.haomeiwen.com/subject/mnmkrctx.html