apply
语法:apply(Mod,Func,[Arg1,Arg2,…,ArgN])
用处:使得Mod,Func可以作为参数传入。
建议:尽量不使用,因为使用之后很多分析个工具无法使用。
元数
定义: 函数的参数个数
两个名称相同,元数不同的函数是完全不同的函数。
属性
语法: -AtomTag(…)
注意: -record(…) , -include(…) 不算模块属性
分两类:
预定义型
- -module(modname) : modname必须是原子,且为文件名。
- -import(Mod,[Name1/Arity1,Name2/Arity2,…]). 声明导入Mod模块中的函数,之后调用不需要模块名。
- -export([Name1/Arity1,Name2/Arity2,…]). 导出函数声明。
- -compile(Opetions).
- -vsn(Version). 制定模块版本号。
用户定义型
- 格式: -SomeTag(Value).
- SomeTag必须是原子
- Value必须是字面数据类型。
- 每个模块中都会自动添加两个函数
- Mod: module_info().
- Mod: module_info(X).
块表达式
使用: 语法要求单个表达式,但是想使用多个。比如列表推导 [ E || … ] E是单个表达式。
格式:
begin
Expr1
…,
ExprX
end
动态代码载入
a模块运行b模块,如果b在运行过程中重新编译或改动了,a会在下一次调用时,调用最新的版本。
如果a模块被改变或重新编译了,那么Erlang虚拟机中有两个a的不同版本同时运行:当前版和旧版。如果继续改变 a,那么当前版变为旧版,重新编译后的移为当前版。
函数引用
目的:想要引用当前或外部模块里定义的某个函数。
格式:
fun LocalFunc/Arity 引用当前模块中的函数。
fun Mod:RemoteFunc/Arity 引用外部模块中的函数。
包含文件
包含的文件必须是 .hrl
-include(Filename).
-include_lib(Name).
列表操作
++ : [1,2,3]++[4,5,6] 为 [1,2,3,4,5,6]
– :
例子:
[a,b,c,1,d,1] – [1] 为 [a,b,c,d,1]
[a,b,c,1,d,1] – [1,1] 为 [a,b,c,d]
注意,如果符号X在B中值出现了K次,那么A值会移除K个X。
宏
格式:
-define (Constant,Replacement). 定义值。
-define(Func(Var1,Var2,…,Var),Replacement). 定义操作。
使用: ?Constant , ?Func( Vaf1,Var2,…Var )
预定义的宏
- ?FILE : 展开成当前的文件名
- ?MODULE : 展开成当前的模块名
- ?LINE : 展开成当前的行号
宏控制流
- -undef(Macro) : 取消宏定义
- -ifdef(Macro) : Macro宏定义过了才执行后面
- -ifndef(Macro) : Macro宏没定义过才执行后面
- -else : 用于ifdef,ifndef 之后。
- -endif : 标记ifdef或ifndef语句的结尾
模式的匹配操作符
例1: func1( [{tag1,A,B}=Z|T)
例2: func1( [tag, {one,A}=Za, B} =Z2 |T])
整数
传统写法: 1, 123,41
K进制整数: K # Digits , 如2#123
$写法: $a是97简写,$1是49简写
进程字典
每个Erlang进程都有一个进程字典的私有数据存储区域,是一种键值对存储。
put(Key,Value) -> OldValue
get(Key) -> Value
get() -> [{Key,Value}] 返回整个字典的数据
get_keys(Value) -> [Key] 返回值为Value的所有键
erase(Key) -> Value 返回Key的关联值,并且删除,没有返回undefined
erase(Key) -> [{Key,Value}] 返回所有值,并删除。
下划线变量
作用1: 命名一个我们不打算使用的变量,例如open(File,_0), open(File,_Mode)
作用2: 用于调试,编译器不会报警告