目录
记录:
在Erlang中使用Tuple ,数据项的顺序\数量都是确定的,一旦数据项顺序调整或者增减字段,都容易出现badmatch.同时一些常量如果硬编码到代码中,一旦数值变化,要想全部可靠的替换成新的数值是一个困难的事情.这两种数据层面的变化,在Erlang中对应的解决方案是: record Macro
一. record
记录的定义如下:
-record(name_of_record,{field_name1, field_name2, field_name3, ......}).
例如,
-record(message_to,{to_name, message}).
这等价于:
{message_to, To_Name, Message}
可以用如下方式创建一个记录:
#message_to{message="hello", to_name=fred)
上面的代码创建了如下的记录:
{message_to, fred, "hello"}
在代码中我们创建一个record:
%%%-------------------------------------------------------------------
%%% @author Administrator
%%% @copyright (C) 2019, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 08. 一月 2019 上午 10:55
%%%-------------------------------------------------------------------
-module(helloworld).
-author("Administrator").
%% API
-export([start/0]).
-export([show2/1]).
-record(man , { name , age=0, school}).
-record(name ,{firstname,lastname}).
start() ->
%See default value
M=#man{},
io:format("M is : ~p ~n", [ M ]),
M2=#man{name="zen", age=23, school = "No.14"},
io:format("M2 is : ~p ~n", [ M2 ]),
M3 = M2#man{name="tt", age=24},
io:format("M3 is : ~p ~n ", [ M3 ]),
M4 = #man{name="tt2", age=M3#man.age},
io:format("M4 is : ~p ~n ", [ M4 ]),
M5 =M2#man{name=#name{firstname="K",lastname="J"},age=24},
io:format("M5 is : ~p ~n ", [ M5 ]),
io:format("M5 firstname is : ~p ~n ", [ M5#man.name#name.firstname ]),
show2(M2).
show2(M) when is_record(M , man) ->
io:format("M is : ~p ~n", [ M ]).
输出结果:
可以看到record在Erlang的内部实现是还是一个tuple
#号标识用的是哪个record;
erlang:is_record/2
判断变量是否是一个记录
用法:
1 |
|
如果 Term 是一个元组,并且它的第一个元素是 RecordTag 的话(即 Term 是否是一个 RecordTag 记录),则返回 true,否则返回 false。
1 2 |
|
宏
在 messager 系统添加的另外一种东西是宏。在 mess_config.hrl 文件中包含如下的定义:
%%% Configure the location of the server node,
-define(server_node, messenger@super).
这个头文件被包括到了 mess_server.erl 文件中:
-include("mess_config.hrl").
这样,在 mess_server.erl 中出现的每个 server_node 都被替换为 messenger@super。
调用规则是在前面加上?server_node
宏还被用于生成服务端进程:
spawn(?MODULE, server, [])
这是一个标准宏(也就是说,这是一个系统定义的宏而不是用户自定义的宏)。?MODULE 宏总是被替换为当前模块名(也就是在文件开始的部分的 -module 定义的名称)。宏有许多的高级用法,作为参数只是其中之一。
摘自:https://blog.csdn.net/u014042372/article/details/86503927