關於Erlang的模式匹配列表的加深理解

1.原本是想實現這個功能:就是把<<"1">>變爲"1":編程

通常用模式匹配來提取函數

原本認爲Z="1"來着,結果打印Z爲49,而後打印"1"的結果卻爲「1」。spa

後來經咱們組的leader的引導:code

能夠看出[49]纔等於"1"        而49不等於"1" ,咱們直到由於在erlang編程下,字符串其實就是列表,而單個字符不是列表,單個字符是列表項中的每一項元素。orm

因此  你的兩個打印函數 等同於字符串

io:format("~p~n", [49]).     
io:format("~p~n", [[49]]).

爲何這個模式匹配沒有提出"1"呢?io

答:<<Z,_/binary>> = <<"1">>. 這個表達式其實就是列表的模式提取Z其編譯

實就是提取了列表頭(這句話是錯的),Z爲字符1,全部整數就49。form

Z就像是列表頭,提出來了以後,列表頭不是列表,而列表尾纔是列表erlang

好比[1,2,3,4,5] = [T|P] 列表頭T爲整數1,而不是列表[1],而列表爲P仍是一個列表爲[2,3,4,5]。

 

由此能夠得出本文開頭的那個問題的解決辦法:這個解決辦法是正確的

可是上面的解釋是錯的,其實<<"1">>裏面的"1"不是一個列表,只是代碼這個字符‘1’,而後底層用其ASII碼存起來就是49

總結:二進制類型裏面只有放整數和字符串,別的類型會失敗 

          

整數:例如<<1,2,3>>表示底層1,2,3存放的8位二進制,

              字符串:以下,其實就是其對應存放的ASCII碼

     其二進制裏面的字符串還有下面的這種現象:

下面其實關於<<"1">>裏面的"1"表明字符'1'的ASCII碼與單獨的"1"字符串是列表的區別能夠經過一下圖也是能夠的:

P提取的是字符'1',其ASCII碼爲49,可是其實還有一個Q=[]空列表,因此字符串"1"其實就是[49]

再來看看<<"1">>的一樣用兩個來提取。

能夠看獲得Z提取的是字符'1',其ASCII碼爲49,和上面同樣,後面的Rest爲空二機制,不是空列表,能夠看出其區別,在二進制裏面的字符串不是列表。

2 在erlang裏面把整數1變爲字符串「1」

也就是列表[49],理解了這一點,就很容易作了,以下:

由於「1」實際上是列表[49],因此將將其放在列表裏面,而後加上48,就好了,別的數字加上對應的就能夠了

3字符串的鏈接

由於字符串在erlang裏面就是列表,因此能夠用這個字符++來鏈接,就像鏈接列表同樣,以下示例:

4 寫erlang列表數據到文件裏面可是不帶中括號[]

用io:format格式化輸出,~s: 打印字符串的時候會不帶[]和「」

下面有個大的例子,寫入列表的數據到文件,可是不要中括號[]

編譯erlc mylib_misc.erl,編譯好了以後去運行,效果以下:

 

後面補充,發現有內置函數,好比<<"1">>變爲「1」,有 binary_to_list ; 而後整數1變爲"1"有integer_to_list

實現起來就更爲簡單了

其實erlang各類數據類型之間的轉換,都有,下面有元組和列表之間的轉換,還有列表到二進制之間的轉換,由此能夠推出,應該各類類型之間的轉換都有

相關文章
相關標籤/搜索