最近看了很多erlang示例,再次做下笔记.
Erlang的数据类型基本上包括以下几类:字符串,数值,二进制,原子(atom),元祖({}),数组([,]).
其中还有几个内置的:pid,端口,引用. 很多地方用到pid,获得自身的pid:self(). 也可以这样定义pid(x,y,z).
Erlang宏定义:-define(THIS_IS_MACRO,thisisreallymacro).
他也有内置宏:- ?MODULE" 是当前模块
- ?FILE 当前文件名
- ?LINE 当前行
Erlang选择语句:
switch ... of ***->; _-> %% 其他的全部zhelichend.
if ***->; true->; %% 其他的全部这里处理end.
还有个when条件处理,这里有个问题就是if语句总有个'true',而且跟switch中的'_'作用一样,为什么是true,而不是false,或者是其他呢? 这个问题...... 就理解为if进来的条件肯定都为true.
Erlang异常捕捉和c++一样也有try...catch
try ......catch _:_ -> ***end.
tryofcatchend.
tryafter %% 和其他语言finally很像catchend.
catch也可以单用,见到的地方问多,可防止出错以后抛异常,导致erlang进程崩溃.一般用在数据库操作那很多.
(catch ...表达式...).
erlang进程之间的数据都是独立的,我们开发系统的时候肯定有共享的数据,那么这些数据怎么处理才能共享呢.其中最常用的就是ets.
使用方法:-record(user,{name,pass,email="@"}).ets:new(ets原子, [f1,f2,f3(字段名和user一样)]),User = #user{name=Name,pass=Pass},ets:insert(ets原子, User),Name = "name",Ms = ets:fun2ms(fun(U) when U#user.name=:=Name -> U end),Fun = fun(T)-> T end,L = ets:select(ets原子, Ms),lists:foreach(Fun, L),ets:lookup(ets原子, Name), %% 默认查找第一个字段ets:delete(ets原子, Name),%% 还有ets:match_objectets:match_deleteets:tab2listets:delete_all_objects
有很多代码中有个"-behaviour",中意:"行为".目前个人理解为设计模式.Erlang系统内部已经实现了各种模式.
用的最多的是 -behaviour(gen_server). 需要实现以下函数:init/1, handle_event/3, handle_sync_event/4, handle_info/3, terminate/3, code_change/4 就像c++接口一样,必须实现函数,不然编译通不过.具体函数调用都是系统底层已经实现.
一些常用指令:
当前目录: pwd(). 目录下文件:ls(). 进入目录:cd("***"). 编译: c(module_name,[debug_info]). 加入调试信息,以便后面调试用. 动态加载: l(module_name). 系统监视:appmin:start(). 简单的调试步骤:- 启动调试:int:start().
- 加载模块:int:i(module_name).
- 设置断点:int:break(module_name,LineNum).
- 启动debug调试器:im().
- 启动: ....... 然后就会中断在断点那了.
- 退出调试 int:stop().