在講述數據類型前先簡單的介紹一下Erlang中的變量,Erlang中的變量和其餘語言中的變量相比有三點不一樣:cookie
1.Erlang不對變量的類型進行定義,它能夠被賦值成任何類型的值,Erlang中全部類型的值統稱爲一個Term。這使得編譯器並不能在編譯時發現數值類型的不匹配,只有在運行時發現錯誤,好處是不像C++同樣能經過強制類型轉換矇蔽系統,形成內存泄露,也使得Erlang不像C++同樣易於發現代碼中的問題。不過Erlang如今已經有一套類型,函數的定義機制,能經過dialyzer來查找代碼中的不匹配了。函數
2.Erlang中的變量只能被賦值一次,第二次賦值將被編譯器理解爲進行比較,若是值相同將返回該值,若是不一樣將會拋出異常。ui
3.Erlang中的變量必須以大寫字母或下劃線打頭,不然將不被編譯器理解爲變量,且大寫字母打頭和下劃線打頭的變量有些不一樣的行爲。atom
1.整數(integer)——整數被記做一串十進制數字,例如,12,12375和-23427都是整數。整數的算術運算是準確的,沒有精度限制spa
2. 浮點數(float)——浮點數被表示爲知足IEEE754[43]規則的64位浮點數。全部±10E308範圍內的實數均可以用Erlang浮點數表示。code
3.支持用$char來獲取字符的ASCII值orm
4.支持進行2-36進制數的表示,如3#11表示4.對象
有點相似於常值。它通常都是由小寫字母打頭的字母組成的,若是其以大寫字母打頭,或者含有除字母,下劃線,@以外的字符,則須要用單引號引發來表示Atom。進程
Atom比C++中的常量更方便易用,好比咱們能夠直接用circle,line來表明不一樣的圖形類型。而不用先定義CIRCLE,LINE常量。內存
Atom好用可是不能濫用,由於用Atom有下面幾點弊端:
1.Atom保存在atom table中,一個Atom佔用4個(32bit)或8個(64bit)字節,且會持續的佔用內存,不參與垃圾回收,另外其自己也有不能超過1048577個的限制。
2.Atom只能進行比較,而不能進行任何的處理操做,好比分隔,匹配等等。
Erlang中的保留字有:
after and andalso band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse query receive rem try when xor
相似於Object,不一樣的是,它的長度是固定的,形式以下:
{Term1,...,TermN}
能夠用模式匹配的方式輕鬆的獲取Tuple中的某一值。
形式以下:
[Term1,...,TermN]
能夠用|來鏈接Head和Tail,其中Head能夠是任意Term,而Tail必須是List。
如[1|2]雖然能正常執行,可是卻不能被length等內置函數使用。
須要注意的是:
length(1|[2,3])爲3,可是
length([1,2]|3)爲2
能夠用模式匹配的方式依次獲取List的Head。
List還支持查詢式的操做,用法以下:
NewList = [Expression || GeneratorExp1, GeneratorExp2, ..., GeneratorExpN, Condition1, Condition2, ... ConditionM]
如,X取值爲1或5,Y取值爲6或7,咱們要找到和能被3整除的X和Y.
[{X,Y}||X<-[1,5],Y<-[6,7],(X+Y) rem 3 =:=0].
輸出[{5,7}]
Bit Strings表明無類型的內存區域,表現形式爲<<E1,...,En>>。
其中Ei的形式爲Value 或 Value:Size 或 Value/TypeSpecifierList 或 Value:Size/TypeSpecifierList
TypeSpecifierList的形式爲Type-Signedness-Endianness-unit:IntegerLiteral.
其中Type能夠是integer(default),float,binary,bytes,bitstring,bits,utf8,utf16,utf32形式的
Signedness能夠是signed或者unsigned(default)
Endianness能夠是big(default),little,native
IntegerLiteral取值範圍是1-256,這個數值用來擴展內存區域,將原來的區域擴展Size*(IntegerLiteral-1)位,默認值爲1,即不進行擴展。
能夠用模式匹配的方式輕鬆的獲取內存區域中某一位置的值,用Erlang來處理數據很方便,可是不推薦使用Erlang來處理大量的數據,由於Erlang在數據處理方面比C++慢。
當Bit Strings中全部的Ei的Size都爲8時,叫作Binaries。
Binaries也支持查詢式的操做,實際上Binaries能查詢獲得List,List也能查詢獲得Binary。最直觀的仍是舉例來看一下。
1.List獲得List
[2*N || N <- [1,2,3,4]]. [2,4,6,8]
2.List獲得Binary,注意要寫明類型或size。
<<<<(N*2):8>> || N <- [1,2,3,4]>>.<<2,4,6,8>>
3.Binary獲得List,注意<-變成了<=
[2*N || <<N>> <= <<1,2,3,4>>]. [2,4,6,8]
4.Binary獲得Binary
<<<<(N*2):8>> || <<N>> <= <<1,2,3,4>>>>.<<2,4,6,8>>
函數對象,有兩種方法給函數對象賦值
1.將一個匿名函數賦值給函數對象。
匿名函數的形式以下:
fun (Pattern11,...,Pattern1N) [when GuardSeq1] -> Body1; ...; (PatternK1,...,PatternKN) [when GuardSeqK] -> BodyKend
2.將一個已經定義的函數賦值給函數對象。形式以下:
fun Name/Arity
fun Module:Name/Arity
其中Name表示函數名,Arity表示參數的個數。
String由雙引號和字符串來表示,其實質是List。如"hello"等價於[$h,$e,$l,$l,$o].
兩個相鄰的字符串將組合成一個字符串,即"he" "llo"等價於"hello"。
也能夠用Binary來表示字符串。
Record相似於Struct,Record表達式會在編譯時轉爲tuple表達式。
1.定義Record:
-record(Name, {Field1 [= Value1], ... FieldN [= ValueN]}).
2.新建Record:
#Name{Field1=Expr1,...,FieldK=ExprK}
其中某些Field能夠省略,這時這些Field將得到默認值。
若是須要將多個Field賦同一值,能夠用下面的方式:
#Name{Field1=Expr1,...,FieldK=ExprK, _=ExprL}
這時全部省略的Field都將被賦值成ExprL
3.訪問Field:Expr#Name.Field
4.更新Field
Expr#Name{Field1=Expr1,...,FieldK=ExprK}
沒有該類型,可是能夠用true和false表明Boolean值。true和false能夠正常的用在一些進行判斷的場合,如:
true and false.
false or true.
true xor false.
not false.
not (true and true).
可是不能和C++中同樣,當成數字來用,要牢記,在Erlang中,它是Atom值。
Pid是Process Identifier(進程標識符)的縮寫,Pid由Erlang的spawn(…)原語建立,Pid是Erlang進程的引用。能夠經過self()獲得當前進程的pid,打印格式:<0.35.0>
端口用於與外界通訊,由內置函數(BIF3)open_port來建立。消息能夠經過端口進行收發,可是這些消息必須遵照所謂「端口協議」(port protocol)的規則。端口和進程差很少,只是他還能夠與外界通訊,端口的打印格式:#Port<0.472>
reference引用是全局惟一的符號,只用來比較兩個引用是否相等。引用能夠經過調用Erlang原語make_ref()來創造。打印格式爲#Ref<0.0.0.39>。引用常被用做各類要求保證惟一性的一次性標籤或cookie。
1.除了tuple_to_list轉換成list時都會盡力轉成字符串形式
atom_to_list(hello)."hello"binary_to_list(<<"hello">>)."hello"binary_to_list(<<104,101,108,108,111>>)."hello"float_to_list(7.0)."7.00000000000000000000e+00"integer_to_list(77)."77"tuple_to_list({a,b,c}). [a,b,c]
2.Number轉binary都轉成了字符串
integer_to_binary(77).<<"77">>float_to_binary(7.0).<<"7.00000000000000000000e+00">>
3.其餘的轉換
list_to_atom("hello"). hello list_to_binary("hello").<<104,101,108,108,111>>list_to_float("7.000e+00").7.0list_to_integer("77").77list_to_tuple([a,b,c]). {a,b,c} term_to_binary({a,b,c}).<<131,104,3,100,0,1,97,100,0,1,98,100,0,1,99>>binary_to_term(<<131,104,3,100,0,1,97,100,0,1,98,100,0,1,99>>). {a,b,c} binary_to_integer(<<"77">>).77binary_to_float(<<"7.000e+00>>").7.0
is_atom/1 is_binary/1 is_bitstring/1 is_boolean/1 is_builtin/3 is_float/1 is_function/1 is_function/2 is_integer/1 is_list/1 is_number/1 is_pid/1 is_port/1 is_record/2 is_record/3 is_reference/1 is_tuple/1