Erlang杂记001

本文介绍了Erlang编程的一些关键知识点,包括原子的使用规则、变量获取表达式返回值的方法、case表达式的应用、定义常用配置的define方式、公共服务进程的调用注意事项、尾递归的重要性及其编写模式、record和map的本质、高效列表操作以及gen_server的行为和返回值处理。强调了避免死循环、优化链表操作以及理解套接字控制进程的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 如果原子不以小写字符开头或者其中包含有除字母,数字,下划线以及@符号之外的其他字符,那么必须放在两个单引号’ '之间,‘Atom’, 原子加上单引号和原来的原子相等.
  2. 用变量获取if或者case … of 表达式返回值,往下继续处理,避免在表达式里的逻辑层次太深.
Var = if xxx ->
Var = case xxx of 
  1. case表达式代码写起来会比较整洁.
case  expression of 
Res1 ->
  xxx;
Res2 ->
  yyy
end.
  1. 常用配置可以用define定义
-define(ETS_OPTIONS, [named_table, public, set, {read_concurrency, true}, {write_concurrency, true}]).
  1. 公共服务进程,例如帮会,对外调用不能用call,因为call会挂起进程不能处理后续的消息,只能使用cast.
  2. Erlang中的循环都要拆分成尾递归处理,尾递归函数一次只处理一个元素.
    尾递归函数编写套路,一般需要编写以下三个函数:
    ①. 递归入口函数,传入待处理参数,以及初始化累计器变量,然后调用尾递归处理函数;
    ②. 正常参数的尾递归处理函数,处理每一个元素, 函数一般以tail_开头;
    ③. 特殊参数的尾递归处理函数,例如结束调用函数,参数常见为.
  3. 尾递归调用要加极限判定,以免死循环.
  4. record本质上是tuple, 转换成元祖后,下标为1的参数为record的名字,下标为2才是第一个参数.
  5. map本质上是lists.
  6. 函数参数中,匹配record的通用写法.
-record(mail,{
		a = 1,
		b = 2
	}).
Mail = #mail{a = A, b = B}
  1. [1,2,3] ++ [4,5]. 将后面的链表接到前面的,这样很耗时,因为要先遍历第一个链表找到尾部,再将
    第二个链接逐个加入. 不用list:append/2 和 ++, 要从头部插入,最后再反转链表.
  2. 创建一个套接字的进程(通过调用gen_tcp:accept或gen_tcp:connect)也就是该套接字的控制进程,该套接字所收到的任何消息都会转发给这个控制进程,如果控制进程消亡,那么该套接字也会自行关闭。我们可以通过gen_tcp:controlling_process(Socket, NewPid)函数来把一个套接字的控制进程改为新的控制进程NewPid, 例如acceptor进程accept了一个连接,然后转移套接字控制权到client进程.
  3. genserver:init成功后会返回{ok, State}, 这个State表示该process的内部状态一直存在,在handle_call,handle_cast,handle_info,terminarte,code_change函数中作为参数存在,一般会在文件头部define定义成server_state.
  4. Erlang实现的函数返回参数,第一个是atom几率很大,要多查看在线文档了解清楚.
  5. handle_cast, handle_call为内部process互相调用时用到,分别对应gen_server:call, gen_server:cast, 而其他消息,例如socket,!调用等则是由handle_info处理.
  6. 简单序列化 term_to_binary, binary_to_term.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值