0
回答
erlang中的命名空间
科大讯飞通用文字识别100000次/天免费使用。立即申请   

最近接触的语言多了,自然就开始有一套“这才是好的特征”的准则。

没有语言(姑且这么说,前辈指正)能脱得了name space。所谓命名空间,就是语言用来管理对象、变量的地方,大概可以是一个字典(键值对),名字--引用地址。

对于erlang来说,这一点做的很不足,它只有一个“一级命名空间”。这会造成什么结果呢?

erlang有一些内置模块(module),模块是erlang以及python这类语言的基础单位,有点像java的包。简而言之,是用来组织具有相近功能的代码管理集合。

io模块是入门的时候第一个会遇到的,因为输入输出在这里。我们拿这个举例。如果我在工程(project)中写了一个io模块,问题就来了,如何区分这两个模块呢?

首先,做一点基础介绍,erlang中的模块声明是这样的:

(oschina竟然没有erlang的代码高亮!)


官方建议,module的文件名和test要保持一致(这从侧面说明了erlang的名字空间问题由来已久)。

这样,我们用编译test模块后,他单薄的name space中,就有了test这个存在。

回到主题,如何区分呢?

我们知道,一般语言中,用来操作名字空间的,都是import(java,python,objective-c等),这个操作指的是导入到当前空间,就相当于扩充了当前的键值对列表,增加了当前代码的见识。erlang中也有import这个操作。在知道packages这个特性之前,我能想到的就是Objective-C干过的事情(cocoa的特征,NS prefix),什么都是NS开头,NSLog,NSString,NSArray。。。我老觉得这样很不好玩。所以我不想这么干,终于我还是得以所愿,找到了package。

package应该是(前辈指正)erlang后期加上的特性,原因我后面会提到。怎么做呢?

首先,找到我们模块声明的地方,加点料,模仿一下java,加上project name等约束元素,如下:

,这样,编译之后命名空间中存在的module name就是‘code.io’了。这样,我们可以通过导入我们的io模块,使用的时候一般可以用,这样,他就会认为你是调用code.io模块,而不是系统的io模块,后来居上。

但是,愚蠢的是作为一个为了工程而存在IDE(eclipse的erlang插件),竟然无视这样的需求,对我的命名报错:

,当然,项目能够正常的工作。

先废话这么多。有新的理解再吐。

官方package教程(http://www.erlang.se/publications/packages.html

举报
何世友
发帖于7年前 0回/605阅
顶部