1.本来是想实现这个功能:就是把<<"1">>变为"1":
一般用模式匹配来提取
本来认为Z="1"来着,结果打印Z为49,然后打印"1"的结果却为“1”。
后来经我们组的leader的引导:
可以看出[49]才等于"1" 而49不等于"1" ,我们直到因为在erlang编程下,字符串其实就是列表,而单个字符不是列表,单个字符是列表项中的每一项元素。
所以 你的两个打印函数 等同于
io:format("~p~n", [49]).
io:format("~p~n", [[49]]).
为什么这个模式匹配没有提出"1"呢?
答:<<Z,_/binary>> = <<"1">>. 这个表达式其实就是列表的模式提取Z其
实就是提取了列表头(这句话是错的),Z为字符1,所有整数就49。
Z就像是列表头,提出来了之后,列表头不是列表,而列表尾才是列表
比如[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各种数据类型之间的转换,都有,下面有元组和列表之间的转换,还有列表到二进制之间的转换,由此可以推出,应该各种类型之间的转换都有