nag*_*aru 13 erlang namespaces
Erlang显然有一个命名空间的概念,我们每天使用像application:start()这样的东西.
我想知道是否存在记录名称空间这样的东西.在我的应用程序中,我定义了记录用户.一切都很好,直到我需要包括来自rabbitmq的rabbit.hrl,它也定义了用户,这与我的冲突.
在线搜索没有太大的作用来解决这个问题.我考虑过重命名我的用户记录并在其前面添加一些内容,比如说"myapp_user".这将解决这个特殊问题,直到我怀疑我的另一个冲突说我的记录"会话".
我有什么选择?在我的所有记录中添加前缀"myapp_"是一种很好的做法,还是对带有记录的命名空间有真正的支持,而我却找不到它?
编辑:谢谢大家的答案.我所学到的是这些记录是全球性的.接受的答案非常明确.我将按照我的预期为所有记录添加前缀.
I G*_*ICE 13
我认为Erlang没有任何名称空间.模块是全局的(除了非常不受欢迎的语言扩展),名称是全局的(无论是节点还是集群),pids是全局的,端口是全局的,引用是全局的,等等.
一切都平坦.因此,Erlang中的命名空间是通过约定而不是任何其他方式完成的.这就是为什么你有<appname>_app
,<appname>_sup
等的模块名称.注册的进程也可能遵循该模式,以及ETS表等.
但是,你应该注意记录本身并不是全局的东西:正如我的正确的OPINION所说的那样,记录只是编码技巧而不是元组.因此,它们是模块定义的本地.模块之外的任何人都不会看到记录,除非它们还包括记录定义(通过复制或使用头文件,后者是最好的方法).
现在我可以争辩说,因为你需要.hrl
在每个模块的基础上包含文件和记录定义,所以没有命名空间记录; 它们在模块中的范围很广,就像变量一样.没有理由命名它们:只包括正确的名称.
当然,可能是您包含来自两个模块的记录定义,并且两个记录具有相同的名称.如果发生这种情况,可能需要使用前缀重命名记录,但根据我的经验,这种情况相当罕见.
请注意,将记录公开给其他模块通常也是一个坏主意.这样做的一个问题是依赖于你的所有模块现在都包含它的.hrl
文件.如果您的模块然后更改记录定义,则必须重新编译依赖于它的每个其他模块.更好的做法应该是实现与数据交互的功能.请注意,get(Key,Struct)并不总是一个好主意.如果您可以选择有意义的名称(年龄,姓名,孩子等),您的代码和API应该对读者更有意义.
您要么需要以不太可能与其他记录冲突的方式命名所有记录,要么需要不跨模块使用它们。在大多数情况下,我会将记录视为不透明的数据结构,并向定义记录的模块添加功能以访问它。这将避免您遇到的问题。