美文网首页
[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