Erlang數據類型

Erlang 數據結構 技術 愛思維 2017-05-02

Erlang提供的數據類型,包括以下幾種:

基本類型

  • 數字(Number)

    數字類型又包含整數(integers)和浮點數(floats)類型,其中整數是精確的而且是支持大數的,小數是滿足IEEE754規則的64位浮點數。Erlang支持ASCII或者Unicode轉換成整數值,同時支持整數不同進制的表示。(‘%’後的內容為註釋)

    1> $a.  %% ASCII表中的a是97

    97

    2> $哈.

    21704

    3> $\n.

    10

    4> 2#100.  %% 用100表示的二進制是4

    4

    5> 4#100.

    16

    6> 16#100.

    256

  • 原子(Atom)

    原子可以理解為一個不可變的常量,必須以小寫字母開頭,如果要以大寫、下劃線或者其他的特殊字符開頭,必須加上單引號。原子在Erlang裡面是存在一張表上面的,原子的個數有上限,大概是在一百萬個左右。

    test

    ‘Myhome’

    ‘_hero’

  • 位串和二進制(Bit Strings and Binaries)

    在大多數情況下,二進制型裡的位數都會是8的整數倍,因此對應一個字節串。如果位數不是8的整數倍,就稱這段數據為位串(bitstring)。所以當我們說位串時,是在強調數據裡的位數不是8的整數倍。位語法是一種表示法,用於從二進制數據裡提取或加入單獨的位或者位串。當你編寫底層代碼,以位為單位打包和解包二進制數據時,就會發現位語法是極其有用的。

    1> <<257,1,2,3,5>>.   %%二進制型的元素如果大於8位的會自動截斷,257截斷成1

    <<1,1,2,3,5>>

    2> <<0:7,1:2>>.   %%二進制型位數如果不是8的整數倍就會產生位串,這邊多了1位1

    <<0,1:1>>

    3> <<0:3,0:4,1:2>>.

    <<0,1:1>>

  • 引用(Reference)

    可以通過make_ref/0函數來創建一個引用,引用在Erlang程序運行時調用make_ref函數產生的是全局唯一的。比如timer模塊在創建一個定時任務的時候通常會返回一個引用,可以通過這個引用來取消定時任務。

  • 函數(Fun)

    函數在Erlang裡面也算是一種數據類型,通過給變量綁定函數,可以通過變量名來執行函數。

    1> Fun = fun(X) -> X * X end.

    #Fun

    2> Fun(9).

    81

  • 端口標識符(Port Identifier)

    端口用於與外界通信,由通過函數open_port/2來創建。消息可以通過端口進行收發,但是這些消息必須遵守所謂“端口協議”(port protocol)的規則。

  • 進程標識符(Pid)

    當創建一個進程的時候會產生一個進程標識符,可以通過這個進程標識符和進程進行通訊。

    1> Process1 = spawn(fun() -> receive X -> io:format(“recv ~p, bye~n”, [X]) end end).

    <0.34.0>  %% 創建一個進程等待接收消息

    2> Process1 ! my_test.  %% 給進程發消息

    recv my_test, bye

    my_test

複合類型

為了方便定義以下的這些複合類型,我把上述的所有基本類型都稱為Term。

  • 元組(Tuple)

    元組類似於C語言裡面的結構體(Struct),是由固定數量的元素組成的複合數據類型,可以定義成如下結構:

    {Term1, Term2, …, TermN}

    可以通過模式匹配或者element/2函數來提取元組裡面元素的值,通過setelement/3來設置元組裡面元素的值,size可以取元組裡面元素的個數。

    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> {adam, Old, {Month, Day}} = P.

    {adam,24,{july,29}}

    7> Old.

    24

  • 映射組(Map)

    映射組是一個由多個Key-Vaule結構組成的符合數據類型,可以定義為如下結構:

    #{Key1=>Value1, Key2=>Value2, …, KeyN=>ValueN}

    其中Key、Value都是Term

    可以通過maps模塊提供的一些函數對映射組進行操作

    1> M1 = #{name=>adam,age=>24,date=>{july,29}}.

    #{age => 24,date => {july,29},name => adam}

    2> maps:get(name,M1).

    adam

    3> maps:get(date,M1).

    {july,29}

    4> M2 = maps:update(age,25,M1).

    #{age => 25,date => {july,29},name => adam}

    5> map_size(M).

    3

    6> map_size(#{}).

    0

  • 列表(List)

    列表類似於其他語言裡面的數組,是由可變數量的元素組成的複合數據結構,可以定義成如下結構:

    [Term1, Term2, …, TermN]

    在Erlang裡面,列表由一個頭和一個尾組成,空列表也是一個列表。所以列表也可以有一個遞歸的定義

    List = [Term| List] | []

    [] 是一個列表, 因此

    [c|[]] 是一個列表, 因此

    [b|[c|[]]] 是一個列表, 因此

    [a|[b|[c|[]]]] 是一個列表, 或者簡寫為 [a,b,c]

    lists模塊可以提供大量函數對列表進行操作:

    1> L = [3,3,4,2,1,2,34].

    [3,3,4,2,1,2,34]

    2> length(L).

    7

    3> lists:sort(L).

    [1,2,2,3,3,4,34]

    4> lists:reverse(L).

    [34,2,1,2,4,3,3]

其他類型(不算數據類型)

  • 字符串(String)

    字符串用一對雙引號括起來,但不算是Erlang中的數據類型。字符串僅僅是列表的一個縮寫,比如:字符串”hello”是列表[$h,$e,$l,$l,$o]的一個縮寫。兩個相鄰的字符串在編譯的時候連接成一個字符串,不會造成任何運行時開銷。

    1> “hello” “ “ “world”.

    “hello world”

  • 記錄(Record)

    記錄其實就是元組的另一種形式。通過使用記錄,可以給元組裡的各個元素關聯一個名稱。對記錄的處理是在編譯的時候完成的,在運行時是不會有記錄的,可以把記錄理解成是元組的一種語法糖。

    12345
    -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}

  • 布爾類型(Boolean)

    在Erlang中沒有Boolean類型。而是用原子true和false來表示布爾值。

    1> 2 =< 3.

    true

    2> true or false.

    true

類型轉換

Erlang提供了一些內置的類型轉換函數,可以方便地進行類型轉換,下面是一些類型轉換的例子:

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.0

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}

14> binary_to_integer(<<”77”>>).

77

15> integer_to_binary(77).

<<”77”>>

16> float_to_binary(7.0).

<<”7.00000000000000000000e+00”>>

17> binary_to_float(<<”7.000e+00>>”).

7.0

最後更新時間:2017-04-30 19:03:42

轉載請註明出處,Darcy's Blog

https://lintingbin2009.github.io/2017/04/30/Erlang數據類型/

相關推薦

推薦中...