erlang中的命名空間(name spacing)

最近接觸的語言多了,天然就開始有一套「這纔是好的特徵」的準則。html

沒有語言(姑且這麼說,前輩指正)能脫得了name space。所謂命名空間,就是語言用來管理對象、變量的地方,大概能夠是一個字典(鍵值對),名字--引用地址。java

對於erlang來講,這一點作的很不足,它只有一個「一級命名空間」。這會形成什麼結果呢?python

erlang有一些內置模塊(module),模塊是erlang以及python這類語言的基礎單位,有點像java的包。簡而言之,是用來組織具備相近功能的代碼管理集合。objective-c

io模塊是入門的時候第一個會遇到的,由於輸入輸出在這裏。咱們拿這個舉例。若是我在工程(project)中寫了一個io模塊,問題就來了,如何區分這兩個模塊呢?eclipse

首先,作一點基礎介紹,erlang中的模塊聲明是這樣的:spa

(oschina居然沒有erlang的代碼高亮!)插件


官方建議,module的文件名和test要保持一致(這從側面說明了erlang的名字空間問題由來已久)。code

這樣,咱們用編譯test模塊後,他單薄的name space中,就有了test這個存在。htm

回到主題,如何區分呢?對象

咱們知道,通常語言中,用來操做名字空間的,都是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

相關文章
相關標籤/搜索