11.每次重装系统时都会重新安装Erlang,Ubuntu安装sh秒杀一切.

https://gist.github.com/zhongwencool/11174620

12. Erlang Shell隐藏的小技巧:

    f(). %%把所有绑定变量释放掉
f(Val). %%把Val变量释放掉
v(Line). %%把Line行函数重新执行一次
v(-1). %%把前一行的函数重新执行一次
rr(Module).%%把Module中的Record加载到Shell中,【超有用】
rr("*/*"). %%把在这个子目录下的所有Module里面的Record给加载到Shell里面
rp(Expression).%%把Expression的全部元素给打印到shell里面【超有用】

rl(). %%列出所有已定义过的Record.rf(RecordName).%%不加载名为RecordName的Record

     %%如果你的code加了debug_info信息【compile:file(Module,[debug_info])】你可以这样看源代码
{ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Beam,[abstract_code]),
io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).

13. Erlang中有很多不可逆函数:比如 binary_to_list/1 , list_to_binary/1

  > binary_to_list(list_to_binary([ <<1,2>>,<<3,4>>])).
[1,2,3,4]

这个坑有点深,踩过才知道!这还有个和binary一起的小Tip:

   > <<"xyz","ets","bt">> =:= <<"xyzetsbt">>.
true

binary居然是等价的。

14.在保护式里面 ,等价于andalso ;等价于orelse------[但是:不是完全相同,原因如下]

   %%相同点:
right_age(X) when X >= 16, X =< 104 -> %% X>=16 andalso X =< 104
true;
right_age(_) –>
false.

不同点:

    %%当Condition1异常出错时,还会去判断Condtion2,如果使用orelse则会直接返回false
func() when Condition1 ; Condition2 –>
ok;
func() –>
error.

可以和http://www.cnblogs.com/zhongwencool/p/3712909.html 第一条对比一下,理解更深哦。

15.如果你想在实践中使用二叉树,请看gb_tree.erl,不要再造不必要的轮子啦,【不过可以考虑用来做练习】

16. 在try catch 的异常处理中禁止使用尾递归:

因为在这个异常处理部分有一个保护机制,Erlang绝对相信异常处理是正常的,如果你在这里面使用尾递归,会出现以下情况:

    1) 尾递归变死循环啦【项目实践中可能会发生的】;
2) 非常多的进程进入了这个异常中,这个尾递归处理的东西又非常复杂,VM运行长久后,block大量的进程和消耗内存

这样的结果是:内存耗尽或程序特别慢,关键你还是查找不到最后的crash的原因。

所以推荐:异常处理中只使用必要且简单的处理就行了。

17. 如果你想在Erlang中 kill一个进程:找到Pid后,exit(Pid,Reasno).【效果和kill一样啦】

大部分情况不会起作用!!!!!因为在项目里面你的进程如果合规范都是在监控树下的,如果被exit/2后还会被监控树自动重启啦,所以你要先把进程移除监控树!!!

    supervisor:terminate_child(SupPid,Pid),
supervisor: delete_child(SupPid,Pid).

18. 2个进程可以双向连接和单向连接:

双向: link(Pid1,Pid2). 重复调用效果一样,也就是说对同2个进程无论调用多少次link,只要使用一次unlink(Pid1,Pid2)就解除连接

单向:erlang:monitor/2   erlang: demonitor/1

19. receive  after Time

这个Time最大值是50*24*60*60*1000,当时间大于50天时,就会报错:

所以要把Time拆成小于最大值的列表:

  normalize(Time) –>
Limit = 49*24*60*60,
[Time rem Limit | lists:duplicate(Time div Limit, Limit)].

然后如果时间列表不为空就不断减少列表并等待直到列表为空:

  loop([T|Next]}) –>
receive
{Server, Ref, cancel} –>
Server ! {Ref, ok}
after T*1000 –>
if Next =:= [] –>
Server ! {done, S#state.name};
Next =/= [] –>
loop(Next})
end
end.

20. gen_server里面的handle_call/3 和handle_cast/2返回值都可以加个Timeout时间。

如果这个时间内没有处理完就会发出一个timeout信息:由handle_info处理,具体可见:http://www.cnblogs.com/zhongwencool/p/erlang_timer.html 里面的方法二。

[Erlang11] 那些经历过的Erlang小坑11-20的更多相关文章

  1. [Erlang02] 那些经历过的Erlang小坑1-10

    1. 保护式(guard)中如果出错,不会报错,只会返回false! case 1=:1 of true when not erlang:length(t) =:= 1 orelse true -&g ...

  2. mciSendString 的两个小坑

    刚刚修正了自己用的小闹钟的代码. 坑1:REPEAT 选项的作用范围 原来用得好好的,之后选择 .wav 文件,居然不出声音了…… 诶,MCI 肯定支持 .wav 的啊…… 仔细想想,我以前都是选 . ...

  3. 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式

    注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...

  4. C#中的Infinity有个小坑

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 昨天家里有事,上网也不方便,就没有推送文章.今天很累,也不长篇大论了.简单介绍一下最近遇到的 ...

  5. 使用EMMET中的小坑

    使用EMMET写HTML的时候,是一个非常爽的事情.但是今天我使用时,发现一个小坑.以前倒也没有注意,不过需要非常的小心. form[action="/process" metho ...

  6. 关于CSS3中transform变换的小坑

    2017年6月30日15:05:46 今天在写一个demo的时候,发现CSS3中transform变换的一个特性. 首先,我先描述一下我发现的情况(问题再现): <div class=" ...

  7. Vue中应用CORS实现AJAX跨域,及它在 form data 和 request payload 的小坑处理

    基本概念部分(一):理解CORS 说道Vue的跨域AJAX,我想先梳理一遍CORS跨域,"跨域资源共享"(Cross-origin resource sharing),它是一个W3 ...

  8. go的变量redeclare的问题,golang的一个小坑

    go的变量声明有几种方式: 1 通过关键字 var 进行声明 例如:var i int   然后进行赋值操作 i = 5 2 最简单的,通过符号 := 进行声明和赋值 例如: i:=5 golang会 ...

  9. MySQL中字段类型为timestamp的小坑

    之前遇到过一个MySQL的字段为timestamp类型的小坑. MySQL中一个字段存储时间类型数据的时候,该字段的类型如果为timestamp类型的话,最多只能存储到2038-01-19 11:14 ...

随机推荐

  1. SqlLoad常用技巧总结

    1.控制文件中注释用“--” 2.为防止导入出现中文乱码,在控制文件中加入字符集控制 LOAD DATA CHARACTERSET ZHS16GBK  3.让某一列成为行号,用RECNUM关键字 lo ...

  2. c#中的序列化

    1.对象的序列化 NET支持对象序列化有以下几种方式:二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serializ ...

  3. Server_id 冲突导致 IO 等待故障

    问题描述: 线上添加新的 MySQL Slave 后,服务器异常. 1.show processlist; Queueing master event to the relay log Reconne ...

  4. 【305】◀▶ ArcPy 相关功能实现

    目录: 1. 同一图层的多个要素合并(2种方法) 2. 导入带经纬度坐标的 txt 文件 3. 栅格计算器的实现 4. 添加 shp 文件(显示在 ArcMap) 5. 通过经纬度坐标生成 Polyg ...

  5. 配置python的豆瓣source

    sunny@sunny-ThinkPad-T450:~$ mkdir ~/.pip sunny@sunny-ThinkPad-T450:~$ gedit ~/.pip/pip.conf [global ...

  6. 浅谈scheduler

  7. Visual Studio Find All no results.

    重装WDK什么的有时候有bug....写下面注册表修复 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Wow6432Node\CLSI ...

  8. VUE+WebPack实现精美Html5游戏设计:纸牌战争

  9. mysql的GTID复制和多源复制

    配置基于GTID的复制--------------------------------------------在参数文件/etc/my.cnf增加下面内容:主库master_info_reposito ...

  10. 26-三个水杯(bfs)

    三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有 ...