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. 汇编调用C程序

    本程序用keil5实现. keil4会将C程序的地址设为0x00000000,即一开始就运行C程序了,参数都还没设置好.这个错误我也没深究,因为我自己装的是keil5. 首先需要在汇编代码中给C程序指 ...

  2. sql之分段统计

    sql之分段统计 需求:获取一个县所有家庭人数在1-2人,3-4人,5-6人,6人以上的家庭数的数组 思路:通过CASE WHEN 将 CBFCYSL分组,然后统计数据条数. 语句: SELECT T ...

  3. SpringMVC配置过程中出现的问题!

    <c:set var="ctx" value="${pageContext.request.contextPath}" />不起作用,原因是web. ...

  4. Linux安装MariaDB+初始化数据库

    背景说明: 在数据库中,mysql的是常用的数据库之一:作为一款开源的软件被广大公司所使用. 但是,mysql在被Oracle公司收购后,难免在以后会有取消开源的问题.所以急需一款新的数据库产品替换m ...

  5. Linux服务管理总结

    简介与分类 系统的运行级别 运行级别 含义 0 关机 1 单用户模式,可以想象为windows的安全模式,主要用于系统修复 2 不完全的命令行模式,不含NFS服务 3 完全的命令行模式,就是标准字符界 ...

  6. ubuntu16.04挂载windows NTFS磁盘方法

    sudo fdisk -l 查看所有磁盘分区 mount命令 mount -t ntfs /dev/sdb3 /mnt/share -o iocharset=utf8,umask= 修改/etc/fs ...

  7. linux安装wifi驱动,开热点

    本次安装的debian系统安装的时候提示wifi硬件需要安装非自由固件才能运行,并告诉本硬件要安装的固件名字叫做iwlwifi-2030-6.ucode.是iwlwifi驱动适配我的wireless硬 ...

  8. linux开机自检配置文件fstab变只读无法修改问题

    控制linux开机自检的配置文件是/etc/fstab,在最近用的服务器中,发现fstab变成了只读权限,无法修改. 解决方法:RH5下,因磁盘改变,而导致系统停在Ctrl+d,此时需输入密码进入修改 ...

  9. 在zookeeper集群的基础上,搭建伪solrCloud集群

    伪集群的搭建:将solrCloud搭建到同一台机器上. 准备工作 1 将在window中部署的单机版solr上传到服务器(虚拟机)中 solr的简单部署:在tomcat中启动slor 的内容 这一次放 ...

  10. Jquery循环select标签,并给指定option添加select属性后在页面上不显示的问题

    <select id="testId"> <option value="">--请选择--</option> <opt ...