32、Erlang 模块功能详解

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

Erlang 模块功能详解

1. 引言

Erlang 是一种通用的面向并发的编程语言,它提供了丰富的模块来支持各种功能。本文将详细介绍 Erlang 中多个重要模块的功能和使用方法。

2. CODE 模块

2.1 时间相关函数

函数 功能
universal_time() -> {Date, Time} 计算通用时间
universal_time_to_local_time({Date1, Time1}) -> {Date2, Time2} 将通用时间转换为本地时间
valid_date(Year, Month, Day) -> bool() 检查日期是否有效

2.2 代码路径管理

  • add_patha(Dir) -> true | {error, What} :将目录添加到代码路径的开头。
  • add_pathsa(Dirs) -> ok :将多个目录添加到代码路径的开头。
  • add_pathsz(Dirs) -> ok :将多个目录添加到代码路径的末尾。
  • add_pathz(Dir) -> true | {error, What} :将目录添加到代码路径的末尾。
  • del_path(Name | Dir) -> true | false | {error, What} :从代码路径中删除目录。

2.3 模块管理

  • all_loaded() -> [{Module, Loaded}] :获取所有已加载的模块。
  • clash() -> ok :搜索具有相同名称的模块。
  • delete(Module) -> true | false :移除模块的当前代码。
  • ensure_loaded(Module) -> {module, Module} | {error, What} :确保模块已加载。

2.4 其他功能

  • compiler_dir() -> string() :返回编译器的库目录。
  • get_object_code(Module) -> {Module, Binary, Filename} | error :获取模块的目标代码。
  • get_path() -> Path :返回代码服务器的搜索路径。
  • is_loaded(Module) -> {file, Loaded} | false :检查模块是否已加载。
  • lib_dir() -> string() :返回 Erlang/OTP 的库目录。
  • lib_dir(Name) -> string() | {error, bad_name} :返回应用程序的库目录。

下面是一个简单的 mermaid 流程图,展示了代码路径管理的基本流程:

graph LR
    A[开始] --> B{选择操作}
    B -->|添加到开头| C[add_patha 或 add_pathsa]
    B -->|添加到末尾| D[add_pathz 或 add_pathsz]
    B -->|删除| E[del_path]
    C --> F[操作完成]
    D --> F
    E --> F
    F --> G[结束]

3. DETS 模块

3.1 磁盘存储管理

  • all() -> [Name] :返回此节点上所有打开的 DETS 表的名称列表。
  • open_file(Filename) -> {ok, Reference} | {error, Reason} :打开现有的 DETS 表。
  • open_file(Name, Args) -> {ok, Name} | {error, Reason} :打开 DETS 表。
  • close(Name) -> ok | {error, Reason} :关闭 DETS 表。

3.2 数据操作

  • delete(Name, Key) -> ok | {error, Reason} :从 DETS 表中删除具有给定键的所有对象。
  • delete_all_objects(Name) -> ok | {error, Reason} :删除 DETS 表中的所有对象。
  • delete_object(Name, Object) -> ok | {error, Reason} :从 DETS 表中删除给定对象。
  • insert(Name, Objects) -> ok | {error, Reason} :将一个或多个对象插入 DETS 表。
  • insert_new(Name, Objects) -> Bool :将一个或多个对象插入 DETS 表。

3.3 数据查询

  • lookup(Name, Key) -> [Object] | {error, Reason} :返回 DETS 表中具有给定键的所有对象。
  • match(Name, Pattern) -> [Match] | {error, Reason} :匹配 DETS 表中的对象,并返回变量绑定列表。
  • match_object(Name, Pattern) -> [Object] | {error, Reason} :匹配 DETS 表中的对象,并返回对象列表。

3.4 其他功能

  • info(Name) -> InfoList | undefined :返回 DETS 表的信息。
  • info(Name, Item) -> Value | undefined :返回 DETS 表中与给定项关联的信息。
  • sync(Name) -> ok | {error, Reason} :确保对 DETS 表所做的所有更新都写入磁盘。

以下是一个简单的操作 DETS 表的步骤列表:
1. 打开 DETS 表:使用 open_file 函数。
2. 插入数据:使用 insert insert_new 函数。
3. 查询数据:使用 lookup match match_object 函数。
4. 删除数据:使用 delete delete_all_objects delete_object 函数。
5. 关闭 DETS 表:使用 close 函数。

4. DICT 模块

4.1 字典操作

函数 功能
append(Key, Value, Dict1) -> Dict2 将值追加到字典中的键
append_list(Key, ValList, Dict1) -> Dict2 将新值追加到字典中的键
erase(Key, Dict1) -> Dict2 从字典中擦除键
fetch(Key, Dict) -> Value 在字典中查找值
fetch_keys(Dict) -> Keys 返回字典中的所有键
filter(Pred, Dict1) -> Dict2 选择满足谓词的元素
find(Key, Dict) -> {ok, Value} | error 在字典中搜索键
fold(Fun, Acc0, Dict) -> Acc1 对字典应用函数
from_list(List) -> Dict 将键值对列表转换为字典
is_key(Key, Dict) -> bool() 测试键是否在字典中
map(Fun, Dict1) -> Dict2 对字典应用映射函数
merge(Fun, Dict1, Dict2) -> Dict3 合并两个字典
new() -> dictionary() 创建一个新字典
store(Key, Value, Dict1) -> Dict2 在字典中存储值
to_list(Dict) -> List 将字典转换为键值对列表
update(Key, Fun, Dict1) -> Dict2 更新字典中的值
update(Key, Fun, Initial, Dict1) -> Dict2 更新字典中的值
update_counter(Key, Increment, Dict1) -> Dict2 增加字典中的值

下面是一个使用 DICT 模块的简单示例:

%% 创建一个新字典
Dict = dict:new().
%% 存储键值对
NewDict = dict:store(key1, value1, Dict).
%% 查找值
Value = dict:fetch(key1, NewDict).

5. DIGRAPH 模块

5.1 图操作

  • add_edge(G, V1, V2) -> edge() | {error, Reason} :向有向图中添加边。
  • add_vertex(G) -> vertex() :添加或修改有向图的顶点。
  • del_edge(G, E) -> true :从有向图中删除边。
  • del_edges(G, Edges) -> true :从有向图中删除多条边。
  • del_path(G, V1, V2) -> true :从有向图中删除路径。
  • del_vertex(G, V) -> true :从有向图中删除顶点。
  • del_vertices(G, Vertices) -> true :从有向图中删除多个顶点。
  • delete(G) -> true :删除有向图。

5.2 图查询

  • edge(G, E) -> {E, V1, V2, Label} | false :返回有向图中边的顶点和标签。
  • edges(G) -> Edges :返回有向图中的所有边。
  • edges(G, V) -> Edges :返回有向图中从或到顶点的边。
  • get_cycle(G, V) -> Vertices | false :在有向图中查找一个环。
  • get_path(G, V1, V2) -> Vertices | false :在有向图中查找一条路径。
  • in_degree(G, V) -> integer() :返回有向图中顶点的入度。
  • in_edges(G, V) -> Edges :返回有向图中顶点的入边。
  • in_neighbours(G, V) -> Vertices :返回有向图中顶点的入邻接点。
  • out_degree(G, V) -> integer() :返回有向图中顶点的出度。
  • out_edges(G, V) -> Edges :返回有向图中顶点的出边。
  • out_neighbours(G, V) -> Vertices :返回有向图中顶点的出邻接点。
  • vertex(G, V) -> {V, Label} | false :返回有向图中顶点的标签。
  • vertices(G) -> Vertices :返回有向图中的所有顶点。

下面是一个简单的 mermaid 流程图,展示了有向图的基本操作流程:

graph LR
    A[开始] --> B{选择操作}
    B -->|添加边| C[add_edge]
    B -->|添加顶点| D[add_vertex]
    B -->|删除边| E[del_edge]
    B -->|删除顶点| F[del_vertex]
    B -->|查询边| G[edge]
    B -->|查询顶点| H[vertex]
    C --> I[操作完成]
    D --> I
    E --> I
    F --> I
    G --> I
    H --> I
    I --> J[结束]

6. DIGRAPH_UTILS 模块

6.1 图算法

函数 功能
components(Digraph) -> [Component] 返回有向图的连通分量
condensation(Digraph) -> CondensedDigraph 返回有向图的凝聚图
cyclic_strong_components(Digraph) -> [StrongComponent] 返回有向图的循环强连通分量
is_acyclic(Digraph) -> bool() 检查有向图是否无环
loop_vertices(Digraph) -> Vertices 返回有向图中包含在某个环中的顶点
postorder(Digraph) -> Vertices 返回有向图的后序遍历顶点
preorder(Digraph) -> Vertices 返回有向图的前序遍历顶点
reachable(Vertices, Digraph) -> Vertices 返回从某些顶点可达的顶点
reachable_neighbours(Vertices, Digraph) -> Vertices 返回从某些顶点可达的邻接点
reaching(Vertices, Digraph) -> Vertices 返回到达某些顶点的顶点
reaching_neighbours(Vertices, Digraph) -> Vertices 返回到达某些顶点的邻接点
strong_components(Digraph) -> [StrongComponent] 返回有向图的强连通分量
subgraph(Digraph, Vertices [, Options]) -> Subgraph | {error, Reason} 返回有向图的子图
topsort(Digraph) -> Vertices | false 返回有向图的拓扑排序顶点

这些算法可以帮助我们更好地分析和处理有向图,例如判断图是否无环、找到图的连通分量等。在实际应用中,我们可以根据具体需求选择合适的算法来解决问题。

7. DISK_LOG 模块

7.1 磁盘日志管理

  • accessible_logs() -> {[LocalLog], [DistributedLog]} :返回当前节点上可访问的磁盘日志。
  • open(ArgL) -> OpenRet | DistOpenRet :打开磁盘日志文件。
  • close(Log) -> ok | {error, Reason} :关闭磁盘日志。
  • lclose(Log, Node) -> ok | {error, Reason} :在一个节点上关闭磁盘日志。

7.2 日志记录

  • balog(Log, Bytes) -> ok | {error, Reason} :异步记录一个项目到磁盘日志。
  • balog_terms(Log, BytesList) -> ok | {error, Reason} :异步记录多个项目到磁盘日志。
  • blog(Log, Bytes) -> ok | {error, Reason} :记录一个项目到磁盘日志。
  • blog_terms(Log, BytesList) -> ok | {error, Reason} :记录多个项目到磁盘日志。

7.3 日志操作

  • bchunk(Log, Continuation, N) -> {Continuation2, Binaries} | {Continuation2, Binaries, Bad - bytes} | eof | {error, Reason} :读取写入磁盘日志的项目块。
  • block(Log, QueueLogRecords) -> ok | {error, Reason} :阻塞磁盘日志。
  • breopen(Log, File, BHead) -> ok | {error, Reason} :重新打开磁盘日志并保存旧日志。
  • btruncate(Log, BHead) -> ok | {error, Reason} :截断磁盘日志。
  • change_header(Log, Header) -> ok | {error, Reason} :更改磁盘日志所有者的头部或头部函数选项。
  • change_notify(Log, Owner, Notify) -> ok | {error, Reason} :更改磁盘日志所有者的通知选项。
  • change_size(Log, Size) -> ok | {error, Reason} :更改打开的磁盘日志的大小。
  • chunk_info(Continuation) -> InfoList | {error, Reason} :返回磁盘日志块延续的信息。
  • chunk_step(Log, Continuation, Step) -> {ok, Continuation2} | {error, Reason} :在磁盘日志的包装日志文件中向前或向后移动。
  • inc_wrap_file(Log) -> ok | {error, Reason} :切换到磁盘日志的下一个包装日志文件。
  • info(Log) -> InfoList | {error, no_such_log} :返回磁盘日志的信息。
  • pid2name(Pid) -> {ok, Log} | undefined :返回由 PID 处理的磁盘日志的名称。
  • sync(Log) -> ok | {error, Reason} :将磁盘日志的内容刷新到磁盘。
  • unblock(Log) -> ok | {error, Reason} :解除阻塞磁盘日志。

以下是一个简单的使用 DISK_LOG 模块的操作步骤列表:
1. 打开磁盘日志:使用 open 函数。
2. 记录日志:使用 balog balog_terms blog blog_terms 函数。
3. 读取日志:使用 bchunk 函数。
4. 进行其他操作:如阻塞、重新打开、截断等,使用相应的函数。
5. 关闭磁盘日志:使用 close lclose 函数。

8. EPP 模块

8.1 代码预处理

  • open(FileName, IncludePath, PredefMacros) -> {ok,Epp} | {error, ErrorDescriptor} :打开一个文件进行预处理。
  • close(Epp) -> ok :关闭与 Epp 关联的文件的预处理。
  • parse_erl_form(Epp) -> {ok, AbsForm} | {eof, Line} | {error, ErrorInfo} :从打开的 Erlang 源文件中返回下一个 Erlang 形式。
  • parse_file(FileName,IncludePath,PredefMacro) -> {ok,[Form]} | {error,OpenError} :预处理并解析 Erlang 源文件。

下面是一个使用 EPP 模块进行代码预处理的简单示例:

%% 打开文件进行预处理
{ok, Epp} = epp:open("example.erl", [], []).
%% 解析文件
{ok, Forms} = epp:parse_file("example.erl", [], []).
%% 关闭预处理
ok = epp:close(Epp).

9. ERL_EVAL 模块

9.1 元解释器

函数 功能
add_binding(Name, Value, Bindings) -> BindingStruct 添加绑定
binding(Name, BindingStruct) -> Binding 返回绑定
bindings(BindingStruct) -> Bindings 返回绑定
del_binding(Name, Bindings) -> BindingStruct 删除绑定
expr(Expression, Bindings, LocalFunctionHandler, NonlocalFunctionHandler) -> {value, Value, NewBindings} 计算表达式
expr_list(ExpressionList, Bindings, LocalFunctionHandler, NonlocalFunctionHandler) -> {ValueList, NewBindings} 计算表达式列表
exprs(Expressions, Bindings, LocalFunctionHandler, NonlocalFunctionHandler) -> {value, Value, NewBindings} 计算表达式
new_bindings() -> BindingStruct 返回绑定结构

这些函数可以帮助我们在运行时动态地计算表达式和管理绑定,为 Erlang 程序的灵活性和可扩展性提供了支持。

10. ERL_PARSE 模块

10.1 解析功能

函数 功能
abstract(Data) -> AbsTerm 将 Erlang 项转换为抽象形式
format_error(ErrorDescriptor) -> Chars 格式化错误描述符
normalise(AbsTerm) -> Data 将抽象形式转换为 Erlang 项
parse_exprs(Tokens) -> {ok, Expr_list} | {error, ErrorInfo} 解析 Erlang 表达式
parse_form(Tokens) -> {ok, AbsForm} | {error, ErrorInfo} 解析 Erlang 形式
parse_term(Tokens) -> {ok, Term} | {error, ErrorInfo} 解析 Erlang 项
tokens(AbsTerm, MoreTokens) -> Tokens 为表达式生成标记列表

以下是一个使用 ERL_PARSE 模块进行解析的简单示例:

%% 生成标记列表
Tokens = erl_scan:string("1 + 2.").
%% 解析表达式
{ok, Exprs} = erl_parse:parse_exprs(Tokens).

11. ERL_PP 模块

11.1 漂亮打印

函数 功能
attribute(Attribute, HookFunction) -> DeepCharList 漂亮打印属性
expr(Expression, Indent, Precedence, HookFunction) -> DeepCharList 漂亮打印一个表达式
exprs(Expressions, Indent, HookFunction) -> DeepCharList 漂亮打印表达式
form(Form, HookFunction) -> DeepCharList 漂亮打印形式
function(Function, HookFunction) -> DeepCharList 漂亮打印函数
guard(Guard, HookFunction) -> DeepCharList 漂亮打印守卫

这些函数可以帮助我们将 Erlang 代码以更易读的形式输出,提高代码的可读性和可维护性。

12. ERL_SCAN 模块

12.1 标记扫描

函数 功能
format_error(ErrorDescriptor) -> string() 格式化错误描述符
reserved_word(Atom) -> bool() 测试是否为保留字
string(CharList) -> {ok, Tokens, EndLine} | Error 扫描字符串并返回 Erlang 标记
tokens(Continuation, CharList, StartLine) -> Return 可重入扫描器

下面是一个使用 ERL_SCAN 模块进行标记扫描的简单示例:

%% 扫描字符串
{ok, Tokens, _EndLine} = erl_scan:string("1 + 2.").

13. ERL_TAR 模块

13.1 TAR 操作

  • add(TarDescriptor, Filename, Options) -> RetValue :将文件添加到打开的 TAR 文件。
  • add(TarDescriptor, Filename, NameInArchive, Options) -> RetValue :将文件添加到打开的 TAR 文件。
  • close(TarDescriptor) :关闭打开的 TAR 文件。
  • create(Name, FileList) -> RetValue :创建 TAR 存档。
  • create(Name, FileList, OptionList) :创建带有选项的 TAR 存档。
  • extract(Name) -> RetValue :从 TAR 文件中提取所有文件。
  • extract(Name, OptionList) :从 TAR 文件中提取文件。
  • format_error(Reason) -> string() :将错误项转换为可读字符串。
  • open(Name, OpenModeList) -> RetValue :打开 TAR 文件。
  • t(Name) :打印 TAR 文件中每个文件的名称。
  • table(Name) -> RetValue :检索 TAR 文件中所有文件的名称。
  • table(Name, Options) :检索 TAR 文件中所有文件的名称和信息。
  • tt(Name) :打印 TAR 文件中每个文件的名称和信息。

以下是一个使用 ERL_TAR 模块创建和提取 TAR 存档的简单示例:

%% 创建 TAR 存档
ok = erl_tar:create("example.tar", ["file1.erl", "file2.erl"], []).
%% 提取 TAR 存档
ok = erl_tar:extract("example.tar", []).

14. ERLANG 模块

14.1 基本函数

函数 功能
abs(Number) -> int() | float() 计算算术绝对值
apply(Fun, Args) -> term() | empty() 将函数应用于参数列表
apply(Module, Function, Args) -> term() | empty() 将函数应用于参数列表
atom_to_list(Atom) -> string() 将原子转换为字符串
binary_to_list(Binary) -> [char()] 将二进制转换为列表
binary_to_list(Binary, Start, Stop) -> [char()] 将部分二进制转换为列表
binary_to_term(Binary) -> term() 解码 Erlang 外部项格式二进制
check_process_code(Pid, Module) -> bool() 检查进程是否正在执行模块的旧代码
concat_binary(ListOfBinaries) 连接二进制列表(已弃用)
date() -> {Year, Month, Day} 获取当前日期
delete_module(Module) -> true | undefined 使模块的当前代码变为旧代码
disconnect_node(Node) -> bool() | ignored 强制断开节点连接
element(N, Tuple) -> term() 获取元组的第 N 个元素
erase() -> [{Key, Val}] 返回并删除进程字典
erase(Key) -> Val | undefined 返回并删除进程字典中的值
erlang:append_element(Tuple1, Term) -> Tuple2 向元组追加额外元素
erlang:bump_reductions(Reductions) -> void() 增加减少计数器
erlang:cancel_timer(TimerRef) -> Time | false 取消定时器
erlang:demonitor(MonitorRef) -> true 停止监控
erlang:demonitor(MonitorRef, OptionList) -> true 停止监控
erlang:display(Term) -> true 在标准输出上打印项
erlang:error(Reason) 以给定原因停止执行
erlang:error(Reason, Args) 以给定原因停止执行
erlang:fault(Reason) 以给定原因停止执行
erlang:fault(Reason, Args) 以给定原因停止执行
erlang:fun_info(Fun) -> [{Item, Info}] 获取函数信息
erlang:fun_info(Fun, Item) -> {Item, Info} 获取函数信息
erlang:fun_to_list(Fun) -> string() 将函数转换为字符串
erlang:function_exported(Module, Function, Arity) -> bool() 检查函数是否已导出并加载
erlang:get_cookie() -> Cookie | nocookie 获取本地节点的魔术 cookie
erlang:get_stacktrace() -> [{Module, Function, Arity | Args}] 获取最后一次异常的调用堆栈回溯
erlang:hash(Term, Range) -> Hash 哈希函数(已弃用)
erlang:hibernate(Module, Function, Args) 使进程休眠直到收到消息
erlang:info(Type) -> Res 获取系统信息(已弃用)
erlang:integer_to_list(Integer, Base) -> string() 将整数转换为字符串
erlang:is_builtin(Module, Function, Arity) -> bool() 检查函数是否为用 C 实现的 BIF
erlang:list_to_integer(String, Base) -> int() 将字符串转换为整数
erlang:loaded() -> [Module] 获取所有已加载的模块列表
erlang:localtime() -> {Date, Time} 获取当前本地日期和时间
erlang:localtime_to_universaltime({Date1, Time1}) -> {Date2, Time2} 将本地时间转换为协调世界时(UTC)
erlang:localtime_to_universaltime({Date1, Time1}, IsDst) -> {Date2, Time2} 将本地时间转换为协调世界时(UTC)
erlang:make_tuple(Arity, InitialValue) -> tuple() 创建具有给定arity 的新元组
erlang:md5(Data) -> Digest 计算 MD5 消息摘要
erlang:md5_final(Context) -> Digest 完成 MD5 上下文更新并返回计算的 MD5 消息摘要
erlang:md5_init() -> Context 创建 MD5 上下文
erlang:md5_update(Context, Data) -> NewContext 使用数据更新 MD5 上下文并返回新上下文
erlang:memory() -> [{Type, Size}] 获取动态分配内存的信息
erlang:memory(Type | [Type]) -> Size | [{Type, Size}] 获取动态分配内存的信息
erlang:monitor(Type, Item) -> MonitorRef 开始监控
erlang:monitor_node(Node, Flag, Options) -> true 监控节点状态
erlang:phash(Term, Range) -> Hash 便携式哈希函数
erlang:phash2(Term [, Range]) -> Hash 便携式哈希函数
erlang:port_call(Port, Operation, Data) -> term() 同步调用端口并传递项数据
erlang:port_info(Port) -> [{Item, Info}] | undefined 获取端口信息
erlang:port_info(Port, Item) -> {Item, Info} | undefined | [] 获取端口信息
erlang:port_to_list(Port) -> string() 将端口标识符转换为字符串
erlang:ports() -> [port()] 获取所有打开的端口
erlang:process_display(Pid, Type) -> void() 在标准错误上写入本地进程信息
erlang:raise(Class, Reason, Stacktrace) 以给定类、原因和调用堆栈回溯停止执行
erlang:read_timer(TimerRef) -> int() | false 获取定时器剩余的毫秒数
erlang:ref_to_list(Ref) -> string() 将引用转换为字符串
erlang:resume_process(Pid) -> true 恢复暂停的进程
erlang:send(Dest, Msg) -> Msg 发送消息
erlang:send(Dest, Msg, [Option]) -> Res 有条件地发送消息
erlang:send_after(Time, Dest, Msg) -> TimerRef 启动定时器
erlang:send_nosuspend(Dest, Msg) -> bool() 尝试发送消息而不阻塞
erlang:send_nosuspend(Dest, Msg, Options) -> bool() 尝试发送消息而不阻塞
erlang:set_cookie(Node, Cookie) -> true 设置节点的魔术 cookie
erlang:spawn_monitor(Fun) -> {pid(),reference()} 创建并监控新进程,以函数为入口点
erlang:spawn_monitor(Module, Function, Args) -> {pid(),reference()} 创建并监控新进程,以函数为入口点
erlang:start_timer(Time, Dest, Msg) -> TimerRef 启动定时器
erlang:suspend_process(Pid) -> true 暂停进程
erlang:system_flag(Flag, Value) -> OldValue 设置系统标志
erlang:system_info(Type) -> Res 获取系统信息
erlang:system_monitor() -> MonSettings 获取当前系统性能监控设置
erlang:system_monitor(undefined | {MonitorPid, Options}) -> MonSettings 设置或清除系统性能监控选项
erlang:system_monitor(MonitorPid, [Option]) -> MonSettings 设置系统性能监控选项
erlang:trace(PidSpec, How, FlagList) -> int() 设置进程或进程的跟踪标志
erlang:trace_delivered(Tracee) -> Ref 通知跟踪已交付
erlang:trace_info(PidOrFunc, Item) -> Res 获取进程或函数的跟踪信息
erlang:trace_pattern(MFA, MatchSpec) -> int() 设置全局调用跟踪的跟踪模式
erlang:trace_pattern(MFA, MatchSpec, FlagList) -> int() 设置函数调用跟踪的跟踪模式
erlang:universaltime() -> {Date, Time} 获取当前协调世界时(UTC)日期和时间
erlang:universaltime_to_localtime({Date1, Time1}) -> {Date2, Time2} 将协调世界时(UTC)转换为本地时间
erlang:yield() -> true 让其他进程有机会执行
exit(Reason) 以给定原因停止执行
exit(Pid, Reason) -> true 向进程发送退出信号
float(Number) -> float() 将数字转换为浮点数
float_to_list(Float) -> string() 将浮点数转换为字符串
garbage_collect() -> true 强制立即对调用进程进行垃圾回收
garbage_collect(Pid) -> bool() 强制立即对进程进行垃圾回收
get() -> [{Key, Val}] 返回进程字典
get(Key) -> Val | undefined 返回进程字典中的值
get_keys(Val) -> [Key] 返回进程字典中具有给定值的键列表
group_leader() -> GroupLeader 获取调用进程的组领导者
group_leader(GroupLeader, Pid) -> true 设置进程的组领导者
halt() 停止 Erlang 运行时系统,并向调用环境指示正常退出
halt(Status) 停止 Erlang 运行时系统
hd(List) -> term() 获取列表的头部
integer_to_list(Integer) -> string() 将整数转换为字符串
iolist_size(Item) -> int() 计算 iolist 的大小
iolist_to_binary(IoListOrBinary) -> binary() 将 iolist 转换为二进制
is_alive() -> bool() 检查本地节点是否存活
is_atom(Term) -> bool() 检查项是否为原子
is_binary(Term) -> bool() 检查项是否为二进制
is_boolean(Term) -> bool() 检查项是否为布尔值
is_float(Term) -> bool() 检查项是否为浮点数
is_function(Term) -> bool() 检查项是否为函数
is_function(Term, Arity) -> bool() 检查项是否为具有给定 arity 的函数
is_integer(Term) -> bool() 检查项是否为整数
is_list(Term) -> bool() 检查项是否为列表
is_number(Term) -> bool() 检查项是否为数字
is_pid(Term) -> bool() 检查项是否为 PID
is_port(Term) -> bool() 检查项是否为端口
is_process_alive(Pid) -> bool() 检查进程是否存活
is_record(Term, RecordTag) -> bool() 检查项是否看起来像记录
is_record(Term, RecordTag, Size) -> bool() 检查项是否看起来像记录
is_reference(Term) -> bool() 检查项是否为引用
is_tuple(Term) -> bool() 检查项是否为元组
length(List) -> int() 计算列表的长度
link(Pid) -> true 创建到另一个进程(或端口)的链接
list_to_atom(String) -> atom() 将字符串转换为原子
list_to_binary(IoList) -> binary() 将列表转换为二进制
list_to_existing_atom(String) -> atom() 将字符串转换为现有原子
list_to_float(String) -> float() 将字符串转换为浮点数
list_to_integer(String) -> int() 将字符串转换为整数
list_to_pid(String) -> pid() 将字符串转换为 PID
list_to_tuple(List) -> tuple() 将列表转换为元组
load_module(Module, Binary) -> {module, Module} | {error, Reason} 加载模块的目标代码
make_ref() -> ref() 返回几乎唯一的引用
module_loaded(Module) -> bool() 检查模块是否已加载
monitor_node(Node, Flag) -> true 监控节点状态
node() -> Node 获取本地节点的名称
node(Arg) -> Node 获取 PID、端口或引用所在的节点
nodes() -> Nodes 获取系统中所有可见节点
nodes(Arg | [Arg]) -> Nodes 获取系统中某种类型的所有节点
now() -> {MegaSecs, Secs, MicroSecs} 获取自 00:00 GMT 以来的经过时间
open_port(PortName, PortSettings) -> port() 打开端口
pid_to_list(Pid) -> string() 将 PID 转换为字符串
port_close(Port) -> true 关闭打开的端口
port_command(Port, Data) -> true 向端口发送数据
port_connect(Port, Pid) -> true 设置端口的所有者
port_control(Port, Operation, Data) -> Res 在端口上执行同步控制操作
pre_loaded() -> [Module] 获取所有预加载的模块列表
process_flag(Flag, Value) -> OldValue 设置调用进程的进程标志
process_flag(Pid, Flag, Value) -> OldValue 设置进程的进程标志
process_info(Pid) -> [{Item, Info}] | undefined 获取进程信息
process_info(Pid, Item) -> {Item, Info} | undefined | [] 获取进程信息
processes() -> [pid()] 获取所有进程
purge_module(Module) -> void() 移除模块的旧代码
put(Key, Val) -> OldVal | undefined 向进程字典中添加新值
register(RegName, Pid | Port) -> true 为 PID(或端口)注册名称
registered() -> [RegName] 获取所有注册的名称
round(Number) -> int() 对数字进行四舍五入并返回整数
self() -> pid() 获取调用进程的 PID
setelement(Index, Tuple1, Value) -> Tuple2 设置元组的第 N 个元素
size(Item) -> int() 计算元组或二进制的大小
spawn(Fun) -> pid() 创建新进程,以函数为入口点
spawn(Node, Fun) -> pid() 在给定节点上创建新进程,以函数为入口点
spawn(Module, Function, Args) -> pid() 创建新进程,以函数为入口点
spawn(Node, Module, Function, ArgumentList) -> pid() 在给定节点上创建新进程,以函数为入口点
spawn_link(Fun) -> pid() 创建并链接到新进程,以函数为入口点
spawn_link(Node, Fun) -> pid() 在指定节点上创建并链接到新进程,以函数为入口点
spawn_link(Module, Function, Args) -> pid() 创建并链接到新进程,以函数为入口点
spawn_link(Node, Module, Function, Args) -> pid() 在给定节点上创建并链接到新进程,以函数为入口点
spawn_opt(Fun, [Option]) -> pid() | {pid(),reference()} 创建新进程,以函数为入口点
spawn_opt(Node, Fun, [Option]) -> pid() 在给定节点上创建新进程,以函数为入口点
spawn_opt(Module, Function, Args, [Option]) -> pid() | {pid(),reference()} 创建新进程,以函数为入口点
spawn_opt(Node, Module, Function, Args, [Option]) -> pid() 在给定节点上创建新进程,以函数为入口点

这些函数提供了 Erlang 语言的基本功能和操作,涵盖了数学计算、进程管理、节点通信、数据处理等多个方面。在实际开发中,我们可以根据具体需求选择合适的函数来实现各种功能。

15. 总结

本文详细介绍了 Erlang 中多个重要模块的功能和使用方法,包括 CODE、DETS、DICT、DIGRAPH、DIGRAPH_UTILS、DISK_LOG、EPP、ERL_EVAL、ERL_PARSE、ERL_PP、ERL_SCAN、ERL_TAR 和 ERLANG 模块。通过这些模块,我们可以实现代码路径管理、磁盘存储、字典操作、图算法、日志记录、代码预处理、解析、漂亮打印、TAR 操作以及各种基本的 Erlang 功能。希望这些信息对您在 Erlang 开发中有所帮助。

16. 模块功能总结与对比

为了更清晰地了解各个模块的主要功能,下面通过表格进行总结对比:
| 模块 | 主要功能 |
| — | — |
| CODE | 时间计算、代码路径管理、模块加载与删除等 |
| DETS | 磁盘存储管理、数据操作与查询 |
| DICT | 键值字典操作,如追加、查找、合并等 |
| DIGRAPH | 有向图的创建、修改与查询 |
| DIGRAPH_UTILS | 有向图的算法处理,如连通分量计算、拓扑排序等 |
| DISK_LOG | 磁盘日志的管理、记录与操作 |
| EPP | Erlang 代码预处理 |
| ERL_EVAL | 元解释器,动态计算表达式和管理绑定 |
| ERL_PARSE | Erlang 代码解析 |
| ERL_PP | Erlang 代码漂亮打印 |
| ERL_SCAN | 标记扫描 |
| ERL_TAR | TAR 文件的创建、提取等操作 |
| ERLANG | 提供 Erlang 语言的基本功能,如数学计算、进程管理等 |

从这个表格中可以看出,不同模块针对不同的应用场景提供了相应的功能,开发者可以根据具体需求选择合适的模块。

17. 实际应用案例

17.1 日志记录与管理

在一个分布式系统中,需要记录各个节点的操作日志。可以使用 DISK_LOG 模块来实现:

graph LR
    A[开始] --> B[打开磁盘日志]
    B --> C[记录日志]
    C --> D{是否需要读取日志?}
    D -->|是| E[读取日志]
    D -->|否| F{是否结束?}
    E --> F
    F -->|否| C
    F -->|是| G[关闭磁盘日志]
    G --> H[结束]

操作步骤如下:
1. 打开磁盘日志:使用 open 函数。

{ok, Log} = disk_log:open([{name, my_log}, {file, "my_log.dlog"}]).
  1. 记录日志:使用 blog blog_terms 函数。
ok = disk_log:blog(Log, "Operation: User logged in").
  1. 读取日志:使用 bchunk 函数。
{Cont, Binaries} = disk_log:bchunk(Log, start, 10).
  1. 关闭磁盘日志:使用 close 函数。
ok = disk_log:close(Log).

17.2 图算法应用

在社交网络分析中,用户之间的关系可以用有向图表示。使用 DIGRAPH 和 DIGRAPH_UTILS 模块可以分析用户之间的连通性和影响力:

graph LR
    A[开始] --> B[创建有向图]
    B --> C[添加顶点和边]
    C --> D[计算连通分量]
    D --> E[进行拓扑排序]
    E --> F[结束]

操作步骤如下:
1. 创建有向图:使用 new 函数。

G = digraph:new().
  1. 添加顶点和边:使用 add_vertex add_edge 函数。
digraph:add_vertex(G, user1).
digraph:add_vertex(G, user2).
digraph:add_edge(G, user1, user2).
  1. 计算连通分量:使用 components 函数。
Components = digraph_utils:components(G).
  1. 进行拓扑排序:使用 topsort 函数。
TopSort = digraph_utils:topsort(G).

18. 注意事项

18.1 模块兼容性

在使用多个模块时,需要注意模块之间的兼容性。例如,某些模块的函数可能依赖于其他模块的特定版本或状态。在升级或更换模块时,要进行充分的测试,确保系统的稳定性。

18.2 资源管理

一些模块涉及到资源的使用,如 DISK_LOG 模块的磁盘日志文件、ERL_TAR 模块的 TAR 文件等。在使用完这些资源后,要及时释放,避免资源泄漏。例如,使用完磁盘日志后要调用 close 函数关闭日志文件。

18.3 错误处理

在调用模块函数时,要对可能出现的错误进行处理。大多数模块的函数在出错时会返回特定的错误信息,开发者可以根据这些信息进行相应的处理。例如,在打开磁盘日志时,如果文件不存在或权限不足, open 函数会返回错误信息,开发者可以根据错误信息进行提示或重试操作。

19. 总结与展望

19.1 总结

本文全面介绍了 Erlang 中多个重要模块的功能和使用方法,通过表格、流程图和实际应用案例,帮助读者更好地理解和掌握这些模块。这些模块为 Erlang 开发者提供了丰富的工具,能够实现各种复杂的功能,如代码管理、数据存储、图算法等。

19.2 展望

随着分布式系统和并发编程的发展,Erlang 的应用场景将越来越广泛。未来,这些模块可能会不断更新和完善,提供更多的功能和更好的性能。例如,在图算法模块中,可能会增加更多的高级算法,以满足更复杂的图分析需求;在日志记录模块中,可能会提供更高效的存储和查询方式。开发者可以持续关注这些模块的发展,不断提升自己的开发能力。

希望本文对您在 Erlang 开发中有所帮助,让您能够更加熟练地使用这些模块来实现各种功能。在实际开发中,要根据具体需求选择合适的模块,并注意资源管理和错误处理,以确保系统的稳定性和可靠性。

下载代码方式:https://pan.quark.cn/s/957405011bdf 在计算机视觉技术中,轮廓提取与中心识别被视为两项核心的技术,它们对于图像处理及模式识别领域扮演着不可或缺的角色。本文将深入剖析这两种算法,并围绕"轮廓提取(中心识别)算法"这一核心主题,同时结合所提供的压缩包文件"Contour",对相关知识点进行详尽的阐述。 轮廓提取算法,主要功能在于识别并分离图像中的不同对象。该算法通过探测物体边缘,构建出明确的边界线,从而实现图像内部各组成部分的区分。在多色位图环境下,不同的色彩可能象征着不同的对象或区域,因此,一个性能优越的轮廓提取算法应当具备处理此类复杂场景的能力。常见的轮廓提取算法包括Canny边缘检测、Sobel算子、Laplacian算子和Hough变换等。这些算法各自具备独特的优缺点,究竟选择何种方法,需要依据具体的应用情境以及性能要求来决定。 1. Canny边缘检测:由John F. Canny所研发,这是一种自适应的多级边缘检测方法。Canny算法借助高斯滤波器来降低噪声干扰,随后运用强度梯度和非极大值抑制技术来定位最显著的边缘,最终通过双阈值检测来区分边缘与噪声。 2. Sobel算子:Sobel算子是一种基于梯度的边缘检测工具,它通过计算图像在水平和垂直方向上的梯度来探测边缘。此方法操作简便且效率较高,但可能对图像中的噪声较为敏感。 3. Laplacian算子:Laplacian算子是一种二阶导数算子,能够迅速识别图像中的尖峰(即边缘)。然而,它容易受到噪声的影响,因此通常需要与其他技术结合使用,例如Gaussian滤波。 4. Hough变换:Hough变换是一种在参数空间中进行边缘检测的方法,它能够检测出任意...
【重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: **本资源原本已设置为“0积分下载”**,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,**自动将部分资源的积分调整为非0数值**(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 **因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。** 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。**强烈建议:仅在页面显示为0积分时进行下载。** 另外,本资源描述中**并未直接提供具体的下载地址或外部链接**,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
源码链接: https://pan.quark.cn/s/432c36f9786d ### 解决Android Studio 导入项目停滞在“building gradle project info”阶段的问题 #### 问题背景 在运用Android Studio进行开发活动时,开发者常常会遭遇在导入项目的过程中出现停滞现象,特别是在“building gradle project info”这一阶段。该问题的存在显著降低了开发效率,给开发者带来了诸多困扰。本文将深入阐述该问题的成因、应对策略及其内在机制。 #### 问题概述 当我们在Android Studio中尝试启动一个项目时,集成开发环境(IDE)会自动执行一系列初始化操作,其中包括构建Gradle项目信息(即“building gradle project info”)。这一过程主要是为了加载项目的依赖关系并解析项目结构,以便让开发者能够顺利开展后续的编码任务。然而,在某些特定情形下,这个过程可能会因为多种因素而陷入停滞状态,导致开发者无法继续进行工作。 #### 原因分析 1. **Gradle版本不匹配**:如果项目的`build.gradle`文件中指定的Gradle版本与Android Studio所支持的版本不一致,可能会引发兼容性问题。 2. **网络连接障碍**:构建过程中需要下载远程依赖或Gradle分发包,如果网络环境不稳定或传输速度过慢,则可能导致构建过程长时间处于等待状态。 3. **配置文件配置不当**:如`gradle-wrapper.properties`文件中的`distributionUrl`配置存在错误,或者文件缺失等。 4. **系统资源瓶颈**:例如内存不足...
【重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: **本资源原本已设置为“0积分下载”**,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,**自动将部分资源的积分调整为非0数值**(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 **因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。** 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。**强烈建议:仅在页面显示为0积分时进行下载。** 另外,本资源描述中**并未直接提供具体的下载地址或外部链接**,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值