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數據類型/