任何语言在使用中都会遇到这样那样的问题,erlang也是。这里整理下我遇到的一些问题,避免继续踩坑。
说实话,“防坑指南”这个标题有点过于标新立异,不过还是希望能引起重视,避免在实际开发中重复犯这些问题。
'--' 运算与 '++'运算
1> [1,2,3,4] -- [1] -- [2].
[2,3,4]
算是erlang经典的问题了。这是从后面算起的,先算 [1] -- [2] ,得到 [1] 后被 [1,2,3,4] --,最后得到 [2,3,4]
'++'运算也是一样的,也是从后面开始算起。
2> [1,2,3,4] -- [1] ++ [2,3,4].
[]
[]
另外,以下这种情况也要注意,只会减去遇到的第一个元素。
3> [1,2,3,2] -- [2].
[1,3,2]
erlang:function_exported()
这个接口是用来检查模块函数是否导出,但是,如果模块没加载过,这个函数返回值就是false
3> erlang:function_exported(odbc,start,0).
false
4> odbc:start().
ok
5> erlang:function_exported(odbc,start,0).
true
|
我之前也讨论过这个问题,解决方案看这里
erlang:list_to_binary()
如果参数是多层嵌套结构,就会被扁平化掉,使用 binary_to_list 不能转成原来的数据,也就是不可逆的。
6> list_to_binary([1,2,[3,4],5]) .
<<1,2,3,4,5>>
如果想可逆,可以使用 erlang:term_to_binary
7> binary_to_term(term_to_binary([1,2,[3,4],5])).
[1,2,[3,4],5]
erlang:list_to_atom()
这个函数用于字符串转原子,本身没什么问题,但是erlang系统有原子总数限制,除非整个节点关闭了,否则原子就算没用到了也不会被gc。而 lists_to_atom() 如果要转换的原子不存在,将会自动重新生成。可以换成另外一个函数 list_to_existing_atom ,只会生成已经存在的原子
2> list_to_atom("erlang"). erlang 3> list_to_existing_atom("erlang"). erlang 4> list_to_existing_atom("hello"). ** exception error: bad argument in function list_to_existing_atom/1 called as list_to_existing_atom("hello") |
除了这里提到的,还有 binary_to_atom() , binary_to_term() 也有这个问题。对于binary_to_atom() 可以换成 binary_to_existing_atom() , 但 binary_to_term () 有点不同,参考 erlang binary数据转换的问题 解决这个问题
erlang:process_info()
这个函数用以查看任意进程的内部数据,比如进程字典数据,消息队列长度,占用内存,当前调用栈等。但是要注意一个问题,如果是查看其他进程,数