[Erlang11] 那些经历过的Erlang小坑11-20
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的更多相关文章
- [Erlang02] 那些经历过的Erlang小坑1-10
1. 保护式(guard)中如果出错,不会报错,只会返回false! case 1=:1 of true when not erlang:length(t) =:= 1 orelse true -&g ...
- mciSendString 的两个小坑
刚刚修正了自己用的小闹钟的代码. 坑1:REPEAT 选项的作用范围 原来用得好好的,之后选择 .wav 文件,居然不出声音了…… 诶,MCI 肯定支持 .wav 的啊…… 仔细想想,我以前都是选 . ...
- 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式
注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...
- C#中的Infinity有个小坑
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 昨天家里有事,上网也不方便,就没有推送文章.今天很累,也不长篇大论了.简单介绍一下最近遇到的 ...
- 使用EMMET中的小坑
使用EMMET写HTML的时候,是一个非常爽的事情.但是今天我使用时,发现一个小坑.以前倒也没有注意,不过需要非常的小心. form[action="/process" metho ...
- 关于CSS3中transform变换的小坑
2017年6月30日15:05:46 今天在写一个demo的时候,发现CSS3中transform变换的一个特性. 首先,我先描述一下我发现的情况(问题再现): <div class=" ...
- Vue中应用CORS实现AJAX跨域,及它在 form data 和 request payload 的小坑处理
基本概念部分(一):理解CORS 说道Vue的跨域AJAX,我想先梳理一遍CORS跨域,"跨域资源共享"(Cross-origin resource sharing),它是一个W3 ...
- go的变量redeclare的问题,golang的一个小坑
go的变量声明有几种方式: 1 通过关键字 var 进行声明 例如:var i int 然后进行赋值操作 i = 5 2 最简单的,通过符号 := 进行声明和赋值 例如: i:=5 golang会 ...
- MySQL中字段类型为timestamp的小坑
之前遇到过一个MySQL的字段为timestamp类型的小坑. MySQL中一个字段存储时间类型数据的时候,该字段的类型如果为timestamp类型的话,最多只能存储到2038-01-19 11:14 ...
随机推荐
- SpringBoot核心
1.基本配置 1.1入口类和@SrpingBootApplication SpringBoot通常有一个名为*Application的入口类,入口类里有一个main方法,这个main方法就是一个标准的 ...
- excel之工作表工作簿保护暴力撤销
excal之工作表工作簿保护暴力撤销 excel可以在审阅中设置工作表.工作簿的密码保护,但是当密码忘记或一些特殊情况下需要进行操作. 1.工作簿保护撤销 步骤一:将需要破解的excal文件后缀名改为 ...
- python学习——练习题(9)
""" 题目:暂停一秒输出. 程序分析:使用 time 模块的 sleep() 函数. http://www.runoob.com/python/python-date- ...
- IOS省电
1.关闭定位 2.关闭后台刷新
- Spring Boot实践——Filter实现
Filter介绍 Filter是Servlet规范规定的,不属于spring框架,也是用于请求的拦截.但是它适合更粗粒度的拦截,在请求前后做一些编解码处理.日志记录等. 一个Filter包括:1).在 ...
- e s6 知识点
http://es6.ruanyifeng.com/#docs/reflect 1.资料对es6箭头函数中的this总结:箭头函数中的this指向的是 定义时的this,而不是 执行时的this.
- Scanner和BufferReader之区别
在Java SE6中我们可知道一个非常方便的输入数据的类Scanner,位于java.util包中,这个Scanner的具体用法为Scanner in = new Scanner(System.in) ...
- 面试-Android之java基础
1.HashMap是否为线程安全. 不安全的. 2.int[] a ={1,2,3,4}; int[]b =a ; b[0]=3; a[0]的值是改变的. 3.组合模式 安卓listview的不同ce ...
- Array.prototype.slice用法详解
slice方法是定义在js数组原型中的方法,用于截取数组的部分元素,具体使用如下: arrayExample.slice(start, end); start为起始元素位置,end为截止元素位置,如: ...
- 处理事件冒泡,阻止默认事件工具类,兼容IE
//处理事件冒泡,阻止默认事件工具类,兼容IEvar eventUtil={ // 添加句柄 addHandler:function(element,type,handler){ if(element ...