名字空間(namespace)
文件地址: https://bbs.aardio.com/doc/reference/the%20language/namespace.html
引入namespace的作用是為了解決變數命令衝突,比如有兩個人都叫張三,一個是江西的,一個是北京的。為了區分他們就可以在名字前面加個地區比如江西.張三
和北京.張三
,這樣你就知道具體是哪一個了。
預設的名字空間
在aardio中預設的名字空間是global
, 當你執行一個檔案時,就會把裡面的變數和程式碼放到global名字空間裡。
使用import語句可以將某個名字空間也放到global或其他名字空間裡,這樣你就能在這個名字空間裡使用它。
這就好像是aardio先給了你一個初始的容器(global),你可以往裡面寫程式碼或者放其他容器,其他容器裡又可以放其他容器。
而global本質上也是一個table,定義的函式和匯入的其他名字空間都是global的成員,可以像表一樣使用global。
import console;
global["console"].dump(type(global))
global.console.log("hello world")
console.pause()
import console;
func1 = function(){
console.log("func1 call")
}
global["func1"]()
console.pause()
注意: var定義的為區域性變數,它不會放到對應的名字空間裡。
import console;
var func1 = function(){
console.log("func1 call")
}
console.dump(global["func1"]) // 列印null
console.pause()
動態匯入名字空間
可以使用global.import
來匯入字串給定的名字空間
global.import("console")
global["console"].dump(console)
console.log("aaaaaa")
console.pause()
名字空間外的變數
我在lib下建立了一個檔案module.aardio
,裡面的程式碼如下:
func = function(){
console.log("aaaaaaaaaaa")
}
namespace module{
}
上面的程式碼將func函式定義在module外了,那它屬於哪個名字空間呢?也是global
。
但是你如果不匯入module名字空間的話,你是無法使用func這個函式的,比如:
import console
func() //報錯
console.pause()
當你匯入module時它才能使用
import console
import module
func()
console.pause()
我估計是import aaa
匯入一個模組時,會先查詢是否有一個檔案或目錄的名稱是aaa,然後將aaa定義的一些全域性變數(不用var修飾的)、全域性函式和名字空間放到global裡。
如果你想在module裡使用func,需要在前面加..
,表示訪問global裡的成員,當然你如果不嫌麻煩的話使用global["func"]
也是可以的
庫程式碼裡import一般會放在名字空間外,然後在用..來訪問
import console;
namespace module{
..console.log("aaaaaa")
}
因為console已經被匯入到global裡,你匯入module也可以用console
不過不建議這麼做,多次匯入並不會出現重複匯入的情況,所以最好是寫多個import避免出錯
import module;
console.log("aaaaaa")
console.pause()
在namespace裡匯入的名字空間也會放一份到global裡,比如module裡的程式碼是下面的,上面的程式碼依然可以執行
namespace module{
import console;
console.log("aaaaaa")
}
global
其實aardio中的名字空間就是用table來實現的,匯入一個名字空間,就是往table裡新增了一個鍵值對,鍵是名字空間的名稱,值則是另一個table(名字空間)。
為了驗證這一點,我們可以在匯入一個名字空間後,刪除掉這個鍵,看看這個名字空間還能不能被使用。
import console
global["console"] = null
console.log("aaaaaaaa") // 報錯。顯示console已經是null了
console.pause()
self
self表示當前名字空間,如果在global下,self === global
是成立的。它的作用應該是你想用字串呼叫名字空間裡的函式時會使用,比如self["func"]
。
本文由部落格一文多發平臺 OpenWrite 釋出!