关于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各类数据类型之间的转换,都有,下面有元组和列表之间的转换,还有列表到二进制之间的转换,由此能够推出,应该各类类型之间的转换都有

相关文章
相关标签/搜索