1. 结构: 应用--<>模块--<>函数--<>语句--<>子语句--<>表达式--<>子语句..
2. 函数式编程
a) 函数式编程,本身不存放状态,对它的影响只有输入参数,而它的影响就是输出函数。
b) 函数式编程,是分布式应用中,高并发,代码热替换的基石
c) Erlang应用就是由这些函数构成的,它的重要理念,everything is function,所有的函数都有返回值。(相当于默认最后一句就是return的值)
3. 变量
a) Erlang是面向函数式编程的,进程本身没有全局变量。
b) 在函数上下文中,可有局部变量,所有的局部变量都是readonly,及只能赋值一次
4. 尾递归优化
a) Erlang没有循环,如果要实现循环只能通过递归来实现。
b) Erlang对函数调回,如果该函数后面没有下文,则被优化,栈空间不会被占用
先看一个例子,对前面的一个总结
raw_read_loop(File, Acc) -> %%函数
case file:read(File, 10) of
{ok, Bytes} ->
raw_read_loop(File, [Acc | Bytes]); %%递归实现循环,尾递归优化
eof ->
file:close(File), %%表达式直接用逗号隔开
{ok, iolist_to_binary(Acc)}; %%子语句用分号隔开
{error, Reason} ->
file:close(File),
erlang:error(Reason)
end.
5. 模式匹配
a) 这个是横行于Erlang和区别其他语言的重要特性
b) 通过模式匹配把函数拆分成多个子句
convert_to_celsius({Name, {c, Temp}}) ->
{Name, {c, Temp}}; %%子句
convert_to_celsius({Name, {f, Temp}}) ->
{Name, {c, (Temp - 32) * 5 / 9}}.
调用convert_to_celsius("ABC", {f, 1234}}) . 根据(f),将匹配第二句
c) 分支判断
case catch onecached_storage:get_item(Storage, Key) of
{ok, {Flags, Data}} ->
...
none ->
ok;
Other ->
...
end.
d) 协议匹配
case Packet of
<<Len:16, PayLoad:Len/binary, 16#ef>> ->
{body, PayLoad};
_ ->
{error, invalid_packet}
end.
总结:
主要说他的限制把,Erlang不是GSL(通用语言),因此使用性和流行度上有天生的限制。流行度不够,所以发展也相对缓慢。其纯函数式编程,对那些复杂业务编程不太适合。