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#并口操作

    using System;using System.Runtime.InteropServices;public class PortAccess { [DllImport("inpout3 ...

  2. leetcode704

    public class Solution { public int Search(int[] nums, int target) { var len = nums.Length; ; ; if (t ...

  3. Delphi 拖动

    interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 ...

  4. ffmpeg编译选项汇总

    编译禁用“jack” 和 “crystalhd” : --disable-crystalhd--disable-indev=jack ================================= ...

  5. 如何理解dart的mixin

    mixin翻译出来就是混入的意思 混入,就是一个类可以使用另一个类里的功能比如方法或者属性,其实这个功能并不陌生 ,有点类似c#里的扩展方法,但是并不同于, mixin和implements有着本质的 ...

  6. Rust 初始配置

    学习 Rust 初始配置 运行环境:Window7 64bit,Rust nightly 1.23; 作者:乌龙哈里 2017-10-15 参考: Rust 中文教程 Rust 官方网站 Rust G ...

  7. STL : 反向迭代器(Reverse Iterator)

    1. 定义反向迭代器(Reverse Iterator)是一种反向遍历容器的迭代器.也就是,从最后一个元素到第一个元素遍历容器.反向迭代器将自增(和自减)的含义反过来了:对于反向迭代器,++运算将访问 ...

  8. 自动删除 Elasticsearch 索引

    #!/bin/bash # author: Wang XiaoQiang# crontab -e# 0 0 * * * /root/script/del_esindex.sh # auto delet ...

  9. 解决 Android Studio 报SDK tools directory is missing

    问题描述: 因为之前已经有安装过sdk manager,在设置中将Android SDK Location设置为Android SDK安装的目录之后还是一直报SDK tools directory i ...

  10. [iOS]隐藏导航栏把右滑退出操作保留

    项目因为用到上面导航栏样式多变,就隐藏了导航栏自己用View代替了,但手势却不见了,后来发现问题解决.操作如下: 千万不要取消 Shows Navigation Bar 这个选项否则手势会消失 应该是 ...