zoukankan      html  css  js  c++  java
  • Erlang 编程参考手册(第一部分)

    Erlang 编程参考手册(第一部分)
     
    2 数据类型
    2.1 项Term
    Erlang提供了一组数据类型,我们将在本章节中逐个认识。某种数据类型的一个实例称为一个项。
    2.2 数值Number
    这里有两种数值类型,整型和浮点型。除了一些常见的转换外,Erlang还有两种特殊的转换形式:
    $char
    获取字符的ASCII码。
    base#value
    base进制(进制的范围为2到36的整数)。在Erlang 5.2/OTP R9B和早前的版本中,这个范围较小,只能是2到16.
    例子:
    1> 42.
    42
    2> $A.
    65
    3> $\n.
    10
    4> 2#101.
    5
    5> 16#1f.
    31
    6> 2.3.
    2.30000
    7> 2.3e3.
    2300.00
    8> 2.3e-3.
    2.30000e-3
    2.3 常量Atom
    一个常量可以看作一个词条,而且该词条就是它的名称。一个常量如果不是以小写字符开始或者包含其他字符(例如数字、_、@等)则应该是使用单引号包起来。
    例子:
    hello
    phone_number
    'Monday'
    'phone number'
    2.4 比特式Binary
    一个比特式用来存储没有类型的内存数据。
    比特式被表示成为比特的直接形式。
    例子:
    1> <<10,20>>.
    <<10,20>>
    2> <<"ABC">>.
    <<65,66,67>>
    更多的例子可以稍等一段时间,会有编程例子放出。
    2.5 引用Reference
    一个引用是在Erlang运行时系统中的一个唯一的项,通过make_ref/0创建。
    2.6 函数项Fun
    一个函数项是一个函数化对象。它可以创建一个匿名函数,并且传递函数自身,作为另一个函数的参数。
    例子:
    1> Fun1 = fun (X) -> X 1 end.
    #Fun<erl_eval.6.39074546>
    2> Fun1(2).
    3
    在编程例子中会有更多的Fun表达式例子,敬请期待。
    2.7 端口标识符Port Identifier
    一个端口标识符就是一个Erlang端口。open_port/2,被用来创建端口,将返回该类型的一个值。
    2.8 进程ID Pid
    一个进程标识符pid,spawn/1,2,3,4,spawn_link/1,2,3,4,和spawn_opt/4,都可以用来创建进程,返回一个该类型的值。例子:
    1> spawn(m, f, []).
    <0.51.0>
    内置函数 self() 返回调用进程的pid,例子:
    -module(m).
    -export([loop/0]).

    loop() ->
        receive
            who_are_you ->
                io:format("I am ~p~n", [self()]),
                loop()
        end.

    1> P = spawn(m, loop, []).
    <0.58.0>
    2> P ! who_are_you.
    I am <0.58.0>
    who_are_you
    2.9 元组Tuple
    带有确定数量的项的复合数据类型:
    {Term1,...,TermN}
    其中每个项都被称为元素。元素的数量就是该元组的大小。
    有很多操作元组的函数。
    例子:
    1> P = {adam,24,{july,29}}.
    {adam,24,{july,29}}
    2> element(1,P).
    adam
    3> element(3,P).
    {july,29}
    4> P2 = setelement(2,P,25).
    {adam,25,{july,29}}
    5> size(P).
    3
    6> size({}).
    0
    2.10 列表List
    带有不定长项的复合数据类型。
    [Term1,...,TermN]
    其中的每一项都称为一个元素。元素的数量就是这个列表的长度。
    形式上,一个列表可以是空列表[]或者是一个有头元素和尾元素的列表。可以使用[H|T]对列表进行划分。列表[Term1,...,TermN]其实可以被表示为[Term1|[...|[TermM|[]]]。
    例子:
    [] is a list, thus
    [c|[]] is a list, thus
    [b|[c|[]]] is a list, thus
    [a|[b|[c|[]]]] is a list, or in short [a,b,c].
    尾部是一个列表的列表有时候称为proper list严格列表。当然,尾部不是列表的列表,例如[a|b]也是合法的。在实际中,我们使用单列表可能更多一点。
    例子:
    1> L1 = [a,2,{c,4}].
    [a,2,{c,4}]
    2> [H|T] = L1.
    [a,2,{c,4}]
    3> H.
    a
    4> T.
    [2,{c,4}]
    5> L2 = [d|T].
    [d,2,{c,4}]
    6> length(L1).
    3
    7> length([]).
    0
    一组操作列表的函数可以在STDLIB中的模块lists中找到。
    2.11 字符串String
    字符串使用双引号引起,但是并不是一个单独的Erlang数据类型。Erlang系统内部是使用[$h,$e,$l,$l,$o]来表示字符串"hello"的,也就是[104,101,108,108,111]。
    两个临近的字符串可以被链接为一个字符串。这是在编译时完成的,而非运行时。例子:
    "string" "42"
    等效于:
    "string42"
    2.12 记录Record
    一个记录是一个数据结构,用来存储定长的元素组。它有一个命名域,这一点与C语言相同。尽管如此,记录并不是一个真正意义上的数据类型。记录被Erlang表示为元组表达式,这也是在编译时完成的。因此,记录表达式并没有被Erlang所真正“认识”,除了某些特殊的操作。
    例子:
    -module(person).
    -export([new/2]).

    -record(person, {name, age}).

    new(Name, Age) ->
        #person{name=Name, age=Age}.

    1> person:new(ernie, 44).
    {person,ernie,44}
    2.13 布尔Boolean
    在Erlang中没有布尔值。而是使用常量true和false来表示。
    例子:
    1> 2=<3.
    true
    2> true or false.
    true
    2.14 转义字符Escape Sequences
    下面是一些可以被使用的转义字符:
    Recognized Escape Sequences.
    描述
    \b
    backspace
    \d
    delete
    \e
    escape
    \f
    form feed
    \n
    newline
    \r
    carriage return
    \s
    space
    \t
    tab
    \v
    vertical tab
    \XYZ, \YZ, \Z
    character with octal representation XYZ, YZ or Z
    \^a...\^z
    \^A...\^Z
    control A to control Z
    \'
    single quote
    \"
    double quote
    \\
    backslash
     
    2.15 类型转换Type Conversions
    下面是一些用来进行类型转换的内置函数:
    1> atom_to_list(hello).
    "hello"
    2> list_to_atom("hello").
    hello
    3> binary_to_list(<<"hello">>).
    "hello"
    4> binary_to_list(<<104,101,108,108,111>>).
    "hello"
    5> list_to_binary("hello").
    <<104,101,108,108,111>>
    6> float_to_list(7.0).
    "7.00000000000000000000e 00"
    7> list_to_float("7.000e 00").
    7.00000
    8> integer_to_list(77).
    "77"
    9> list_to_integer("77").
    77
    10> tuple_to_list({a,b,c}).
    [a,b,c]
    11> list_to_tuple([a,b,c]).
    {a,b,c}
    12> term_to_binary({a,b,c}).
    <<131,104,3,100,0,1,97,100,0,1,98,100,0,1,99>>
    13> binary_to_term(<<131,104,3,100,0,1,97,100,0,1,98,100,0,1,99>>).
    {a,b,c}

  • 相关阅读:
    redis的发布与订阅机制
    三次握手与四次挥手详解
    super的实例及实现原理
    【node.js】入门篇
    简单理解什么是数据库CDC?(以mysql为例)
    Java小工具类(一)json的K-V转换为Java类属性
    linux系统文件拷贝命令rsync
    linux系统配置常用命令top
    关于ganymed-ssh2版本262和build210的SCPClient类的区别
    阿里巴巴java-数据库开发手册(2020泰山版)
  • 原文地址:https://www.cnblogs.com/xiayong123/p/3717108.html
Copyright © 2011-2022 走看看