- 如果原子不以小写字符开头或者其中包含有除字母,数字,下划线以及@符号之外的其他字符,那么必须放在两个单引号’ '之间,‘Atom’, 原子加上单引号和原来的原子相等.
- 用变量获取if或者case … of 表达式返回值,往下继续处理,避免在表达式里的逻辑层次太深.
Var = if xxx ->
Var = case xxx of
- case表达式代码写起来会比较整洁.
case expression of
Res1 ->
xxx;
Res2 ->
yyy
end.
- 常用配置可以用define定义
-define(ETS_OPTIONS, [named_table, public, set, {read_concurrency, true}, {write_concurrency, true}]).
- 公共服务进程,例如帮会,对外调用不能用call,因为call会挂起进程不能处理后续的消息,只能使用cast.
- Erlang中的循环都要拆分成尾递归处理,尾递归函数一次只处理一个元素.
尾递归函数编写套路,一般需要编写以下三个函数:
①. 递归入口函数,传入待处理参数,以及初始化累计器变量,然后调用尾递归处理函数;
②. 正常参数的尾递归处理函数,处理每一个元素, 函数一般以tail_开头;
③. 特殊参数的尾递归处理函数,例如结束调用函数,参数常见为. - 尾递归调用要加极限判定,以免死循环.
- record本质上是tuple, 转换成元祖后,下标为1的参数为record的名字,下标为2才是第一个参数.
- map本质上是lists.
- 函数参数中,匹配record的通用写法.
-record(mail,{
a = 1,
b = 2
}).
Mail = #mail{a = A, b = B}
- [1,2,3] ++ [4,5]. 将后面的链表接到前面的,这样很耗时,因为要先遍历第一个链表找到尾部,再将
第二个链接逐个加入. 不用list:append/2 和 ++, 要从头部插入,最后再反转链表. - 创建一个套接字的进程(通过调用gen_tcp:accept或gen_tcp:connect)也就是该套接字的控制进程,该套接字所收到的任何消息都会转发给这个控制进程,如果控制进程消亡,那么该套接字也会自行关闭。我们可以通过gen_tcp:controlling_process(Socket, NewPid)函数来把一个套接字的控制进程改为新的控制进程NewPid, 例如acceptor进程accept了一个连接,然后转移套接字控制权到client进程.
- genserver:init成功后会返回{ok, State}, 这个State表示该process的内部状态一直存在,在handle_call,handle_cast,handle_info,terminarte,code_change函数中作为参数存在,一般会在文件头部define定义成server_state.
- Erlang实现的函数返回参数,第一个是atom几率很大,要多查看在线文档了解清楚.
- handle_cast, handle_call为内部process互相调用时用到,分别对应gen_server:call, gen_server:cast, 而其他消息,例如socket,!调用等则是由handle_info处理.
- 简单序列化 term_to_binary, binary_to_term.