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

Python成长路發表於2024-04-02

名字空間(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 釋出!

相關文章