erlang中的命名空间(name spacing)
2011-07-25 16:59
162 查看
最近接触的语言多了,自然就开始有一套“这才是好的特征”的准则。
没有语言(姑且这么说,前辈指正)能脱得了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)
没有语言(姑且这么说,前辈指正)能脱得了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)
相关文章推荐
- domain name和Netbios domain name。不一致的命名空间。
- Liferay Requires Name Spaced Parameters(命名空间)
- 用dom解读xml的时候,如果碰到有命名空间的时候(就是节点名字有:的时候)需要把xml文件中的那个命名空间地址和名字拿出来加到XmlNamespaceManager 里面去
- C++中的命名空间(using name std)
- PHPExcel导入导出 若在thinkPHP3.2中使用(无论实例还是静态调用(如new classname或classname::function)都必须加反斜杠,因3.2就命名空间,如/classname
- 关于xml命名空间的——xmlns:f="http://www.name.com.cn/sub",一些疑问
- string' does not name a type 及命名空间
- HTTP 无法注册 URL http://+:xxxxx/ServicesName/。进程不具有此命名空间的访问权限
- python __name__属性带来命名空间问题
- 从数据库中查询出命名空间和formname动态打开窗体
- Asp.net .net(C#) 获取当前命名空间,类名,方法名的方法
- C++命名空间
- 命名用jquery扩充命名空间
- 如何理解php中命名空间概念
- 如何在XSLT样式表中声明命名空间
- C++ 之 命名空间
- MVC4项目中(.net 4.5)区域模块中 报错 “System.Web”中不存在类型或命名空间名称“Optimization”
- 【013】命名空间和模块化编程2
- phpstrom中自动补全命名空间
- 命名空间std,using namespace std