aardio教程四) 理解名字空間(namespace)

名字空間(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 發佈!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章