Erlang Module Attributes

Module的Attribute形式如下:

-Attr(Value).

其中Attr为atom,Value可以为任何直接的term。

Attribute包含预定义的Attributes以及用户自定义的Attributes。

[b]预定义模块Attribute(Pre-Defined Module Attributes):[/b]
-module(Module)

名为Module的模块声明,Module为atom,Module必须与此文件文件名相同(除去.erl后缀名,比如module1.erl,则Module为module1)

-export(Functions)

说明本模块导出的函数列表,Functions形式如下[Function1/Artiy1, ..., FunctionN/ArityN],其中FunctionN为atom,ArtityN为integer

-import(Module, Functions)

引入某个模块的函数列表,这样使用Module的函数时,可以像使用本地函数一样,不用指定模块前缀。Functions与export中的 Functions相同,Module为atom。推荐不要使用import,因为容易混淆,而且影响代码自动更新。(这里类似C++中的using namespace std; 这样以后使用stl相关的函数,类时不用添加std::前缀)

-compile(Options)

指定编译选项,具体参考compile文档。在我们写代码时,经常使用-compile(export_all),将本模块中的所有函数导出,这里仅是为了测试代码方便,在最后的产品中,应该尽力减少每个模块导出的函数。

-vsn(Vsn)

模块的版本信息,Vsn为一个字面信息,可以为任何Term。可以通过beam_lib:version/1获取,如果没有指定vsn则默认为Module的checksum

注意:-record,-macro不时模块的属性,尽管它们很像。

[b]用户自定义Attributes(User-Defined Attributes):[/b]
-SomeTag(Value)

SomeTag为atom,Value为任何具有直接字面意义的Term。
Attribute的获取

Module的Attributes信息,会在Module被编译的时候添加到beam文件中。因此可以通过 Module:module_info()获取Moudle的整体信息,也可以通过Module:module_info(attributes)获取所有用户自定义的属性信息。也可以通过:beam_lib:chunks("module.beam", [attributes])获取所有用户自定义的属性信息。

让我们写一小段代码,用来方便获取某个属性:


-module(extract).
-export([attribute/2]).
attribute(File, Key) ->
case beam_lib:chunks(File, [attributes]) of
{ok, {_Module, [{attributes, L}]}} ->
case lookup(Key, Key) of
{ok, Value} ->
Value;
error ->
exit(badAttribute)
end;
_ ->
exit(badFile) end.

lookup(Key, [{Key, Val} | _Tail]) -> Val;
lookup(Key, [_H | Tail]) -> lookup(Key, Tail);
lookup(Key, []) -> error.


Update:现在我们已经不需要这个函数了,在R12B中,每个Module自动引入了一个module_info函数,我们可以通过其获取Module的各种属性
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值