# Erlang学习笔记

# 1. record_info(fields, RecordName).

Erlang预处理器对表达式 record_info(fields, RecordName)进行处理,将由记录名标识的包含有不同域的记录解析为列表。

# 2. hd(X).

获取 X 列表头

# 3. timer:send_after/2-3

timer:send_after(10000,["hello nihao"]).

# 4. flush().

flush()命令查看shell 进程的邮箱消息,并清除邮箱消息。

# 5. lists:duplicate/2

函数 lists:duplicate/2 会按照第一个参数指定的份数,复制第二个参数指定的表达式([a,a,a]=lists:duplicate(3,a))。

# 6. lists:sort(Fun, List1) -> List2

如果Fun函数返回true,则排序是从小到大的顺序,否则,从大到小。
其中Fun有两个参数。
例子
lists:sort(fun(A,B)-> A>B end,[1,2,3]).
结果
[3,2,1]

# 7. 应用资源文件

应用文件的基本结构如下:
{application, ApplicationName, Properties}.
    ApplicationName 是一个原子, Properties 是一个{Key, Value}元组列表,用来描述应用。 OTP 会使用这些内容来弄清楚应用要做什么。这些元组都是可选的,不过,如果想对运行中的系统进行调试或者要保证不同应用之间的有序交互,它们非常有用。对于某些工具,这些元组也是必需的。现在,我们先来了解一下其中的一个子集,需要时再对其他的选项进行介绍。

{description, "Some description of your application"}
    这个元组提供了一个简短的应用描述。默认值是一个空字符串。虽然这个元组是可选的,但是我建议始终提供一个应用描述,因为它可以让应用更好理解。
{vsn, "1.2.3"}
    这 个 元 组 定 义 了 应 用的版 本 号 。 版 本 字 符 串可以 采 用 任 何 格 式 。 通常, 遵守Major.Minor.Patch 或者某种类似的格式是个不错的主意。当用工具来进行升级或者降级时,可以用这个字符串来标识应用的版本。

{modules, ModuleList}
    这个元组包含着应用导入系统中的所有模块。一个模块最多属于一个应用,不能同时出现在两个应用的 app 文件中。系统和工具可以通过这个列表检查应用对模块的依赖关系,确保所有模块都就绪到位,并且和系统中其他已加载应用间没有冲突。如果使用了标准的 OTP结构,并且使用了像 rebar 之类的 Erlang 构建工具,就会自动处理这些事情。

注意 Rebar 是 Erlang 社区常用的一种构建工具。它理解 OTP 应用背后的原则,可以像Emakefile 那样编译文件。同时还可以根据需要从 git 和 mercurial 代码库中提取所依赖的应用。

{registered, AtomList}
     这个元组包含所有被应用中的进程注册的名字。在试图把一组应用捆绑在一起时,OTP可以通过这个信息知道是否存在名字冲突,不过,这完全基于相信开发人员提供了正确的信息。我们都知道,实际情况并非总是如此,因此不要盲目相信,一些测试工作是必不可少的。

{env, [{Key, Val}]}
    这个元组是一个键/值列表,用来作为应用的配置信息。在运行时,可以通过调用application:get_env(Key)或者 application:get_env(AppName,Key)获取这些信息。前者会从发起当前调用的进程所属应用的应用文件中进行查找。后者则从指定的应用中进行查找。这些值可以根据需要被改写(可以在启动时,或者通过调用 application:set_env(Application,Key,Value))。由于这些值可能会被改写, 因此应用资源文件中的 env 部分通常作为应用的默认配置。这些默认值可以让用户只需最小化的配置即可使用应用。
    总之,这个元组非常适合用来存储配置数据,这样就不用把配置数据以某种随意的格式放在一组配置文件中,也不用关心把它们存放到哪里。不过,人们总是倾向于开发自己的配置管理系统,因为并不是所有人都喜欢用 Erlang 语法编写配置文件。

{maxT, Milliseconds}
    这个元组指应用的最长运行时间,之后应用会被关闭。这个字段很少使用。Milliseconds 的默认值为 infinity,因此通常无需关心这个字段。

{applications,AtomList}
    这个元组是应用所依赖的其他应用的列表。在自己的应用被加载/启动前, Erlang 的应用管理系统会 确保这些被 依赖的应用先 被加载或者 启动。所有的 应用都至少 要依赖于kernel 和 stdlib,不过如果自己的应用要依赖于 ppool 先被启动,那么就要把 ppool加到这个列表中。把所依赖的应用增加到这个列表中非常重要,因为 OTP 会根据这个列表判断一个应用是否能被加载或者启动。如果不这样做,会给自己制造麻烦。

注意 标准库和 VM 的 kernel 本身也都是应用,这意味着,虽然 Erlang 是构建 OTP 所使用的语言,但是它的运行环境在工作时也要依赖于 OTP。这是一种循环依赖。这也是为什么这门语言被官方命名为 Erlang/OTP 的一个原因。

{mod, {CallbackMod, Args}}
     这个元组定义了应用的回调模块, 这个模块会实现应用行为(详见 19.4 节)。 它会通知OTP,在启动应用时,应该调用 allbackMod:start(normal,Args)。同时,在停止应用时,要调用 CallbackMod:stop(Args)。通常用应用名字来命名 CallbackMod 模块。

# 8. Emakefile解释

需要增加一个 Emakefile 文件(文件名为 Emakefile,存放在应用的根目录中), 用于以后源代码的编译和运行。

{"src/*", [debug_info, {i,"include/"}, {outdir, "ebin/"}]}.
{"test/*", [debug_info, {i,"include/"}, {outdir, "ebin/"}]}.
1
2

这个文件告诉编译器, 要对 src/和 test/目录下的所有文件增加 debug_info 选项, 到 include/目录中寻找包含文件(如果需要的话),然后把编译后的结果放到 ebin/目录中。

# 9. 获取某主机的地址信息

例如:获取 im.nbiots.xyz 主机的地址信息

inet:gethostbyname("im.nbiots.xyz").
1

{ok,{hostent,"im.nbiots.xyz",[],inet,4,[{49,234,110,12}]}}

# 10. 映射组模式匹配

对映射组做模式匹配时必须使用  := 置值运算符

Last Updated: 11/1/2020, 2:18:11 PM