erlang知识点小结

  1. 动态产生原子会内存泄漏?怎么动态的产生原子?(erlang趣学指南第6页)

  2. 函数中的最后一个表达式的执行结果会被自动作为返回值转递给调用者。

  3. 在Erlang社区中,在模块的概括性注释(模块是做什么的,许可证等)以及模块的区段分隔注释(共有代码、私有代码、辅助函数等)中使用3个百分号。在所有其它需要放置在独立行中的注释使用2个百分号(%%),并和周边的代码采用同样的缩进。防止代码之后的行内注释,使用单个%。

  4. module、export、import

  5. =:=、=/=会区分数据类型,==、/=不区分精度!

  6. 小于等于 : =< ,而不是 <=

  7. 数据类型之间的大小顺序是:number

  8. 注意以[1|2]这种形式构建出来的列表称为非良构列表(improper list)。非良构列表可以用于[Head|Tail]这种形式的模式匹配,但是在Erlang的标准函数(即使是length())中使用时会失败。这是因为Erlang期望的是良构列表(proper list)。良构列表的最后一个元素是空列表。当定义一个像[2]这样的数据项时,这个列表会被自动地转换成良构形式。同样,[1|[2]]也会被转换成良构形式。尽管非良构列表是合乎语法的,但是除了某些用户自定义数据结构,它们的用途非常有限。

  9. <> = <<213,45,132,……>>.
    Rest/binary会自动匹配剩下的元素。

  10. 理解二进制推导式和列表推导式

  11. define 宏定义

  12. 一定要避免环形依赖

  13. 函数头中可以使用=操作符,例如:
    valid_time( { Date = {Y,M,D} }) ->
    io:format(“The Date tuple (~p) says today is : p/p/p,n”,[Date,Y,M,D]).

  14. and 约等于 & ,andalso 约等于 && 。or 约等于 | ,orelse 约等于 ||。

  15. receive没有匹配的模式,消息会被保存起来供以后处理。此处会产生性能损耗

  16. 普通进程互相连接时,一个进程出现异常时(退出原因不是normal时),会导致所有连接的进程全部停止。

  17. 了解显示错误信号和不可捕获的退出信号

  18. 执行process_flag(trap_exit,ture)将进程转化为系统进程,系统进程可以捕获退出信号。(系统进程是否和普通进程一样都是相对虚拟机而不是操作系统,两种进程只是权限不同?)

  19. exit(Why)如果不在catch语言的范围内,则会停止当前进程,并向连接的进程广播一个带有参数Why的退出信号。会向监视它的进程广播一个Down消息。

  20. exit(Pid,Why)不会退出当前进程,用于伪造退出信号。(那么它会向监视它的进程发送Down消息吗?)

  21. 深入了解匿名函数的作用域和闭包,可以用其传递参数!

  22. 优质博客
    erlang系统技术

  23. 有序字典orddict的大小应该控制在75个以内。

  24. 键值存储的主要结构:少量数据 : proplist(属性列表) ,orddict(有序字典);大量数据:dict,GB(通用平衡树)。

  25. 函数匹配是从上到下,匹配到那个就进入哪儿,出错就出错,不会出错后匹配下一个。
    如果两个函数上下调换,则拥有无法进入“func3(Data, Begin, End, Begin) -> func3_1(Data, Begin, End, 0);”

func3(Data, Begin, End, Begin) -> func3_1(Data, Begin, End, 0);
func3(Data, Begin, End, Index) -> func3(tl(Data), Begin, End, Index + 1).
  1. 对列表操作,出了取头和length,其他操作效率都偏低。
  2. 尽量用模式匹配而不用if。
  3. erlang:get_stacktrace() 获取的是当前进程中出现的上一次错误的堆栈。必须要有catch语句,否则 erlang:get_stacktrace()无法获取到。
func17_1() ->
  try 1 / 0
  catch error:X -> 1  %如果没有catch ,则执行func17()为[].
  end.

func17() ->
  {erlang:get_stacktrace()}.

调用:

65> test1:func17_1().
1
66> test1:func17().
{[{test1,func17_1,0,[{file,"test1.erl"},{line,261}]},
  {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,674}]},
  {shell,exprs,7,[{file,"shell.erl"},{line,686}]},
  {shell,eval_exprs,7,[{file,"shell.erl"},{line,641}]},
  {shell,eval_loop,3,[{file,"shell.erl"},{line,626}]}]}
  1. spawn( foreman,loop,[] ) 以MFA的方式创建进程时,需要将 loop 导出!!
  2. 重点学习 ets 的选择操作。 ETS还具有 解析转化 功能,比较强大,自行再学。
  3. lists:foldl/3是尾递归,lists:foldr/3不是尾递归
  4. gen_tcp:listen创建的Listen的生命周期跟创建它的进程是绑定在一起的,可以使用timer:sleep(infinity).使进程永远存活(虚拟机不出异常、不被其他进程关闭的情况下)。
  5. 分布式开发中,两个节点之间都是通过单条TCP连接的,消息是顺序串行发送!发送长消息时会阻塞其他的消息!并且节点之间是通过心跳包来保持联系,过多的长消息会导致A节点误以为B节点失活!
  6. Erlang的GC是以进程为单位,对某个进程GC不会影响其他进程的执行。
  7. appmon已经改名为observer,启动方式:erl控制台输入observer:start().
  8. 使用监督树的simple_one_for_one启动worker进程时,worker进程的start_link的返回值必须是{ok,Pid}.

你可能感兴趣的:(Erlang)