lua程式設計 全域性變數 環境 模組

2021-06-27 00:42:00 字數 1228 閱讀 5654

1.全域性變數與環境

lua中真正儲存全域性變數的地方不是在_g裡面,而是在setfenv(i,table)的table中,所有當前的全域性變數都在這裡面找,只不過在程式開始時lua會預設先設定乙個變數

_g=這個裡面的table而已。所以在新設定環境後,如果還想找到之前的全域性變數,通常需要附加上為新的table設定元表

下面的幾個例子:

a=1print(a)

print(_g.a)

--正常情況,輸出1,1

a=1setfenv(1,{})

print(a)

print(_g.a)

--這時會出錯說找不到print,因為當前的全域性變數表示空的,啥也找不到的

a=1setfenv(1,)

_g.print(_g.a)

print(a)

--這時_g.print(_g.a)可以正常嗎,因為可以在新的table中找到乙個叫_g的表,這個_g有之前的奈爾全域性變數,但是下面的print(a)則找不到print,因為當前的table沒有乙個叫print的東西

local mt=

local t={}

setmetatable(t,mt)

setfenv(1,t)

print(a)

print(_g.a)

--這是正確輸出,因為新的全域性表採用之前的表做找不到時的索引,原先的表裡面存在print 、_g、 a這些東西

setfenv的第乙個引數可以是當前的堆疊層次,如1代表當前**塊,2表呼叫當前的上一層,也可以是具體的那個函式名,表示在那個函式裡。

每個新建立的函式都將繼承建立它的那個函式的全域性環境

2.require

require的意義就是匯入一堆可用的名稱,這些名稱(非local的)都包含在乙個table中,這個table再被包含在當前的全域性表(「通常的那個_g」)中,這樣訪問乙個模組中的變數就可以使用_g.table.**了,(剛開始學習lua時還以為模組裡的名稱在匯入後直接就是在_g中的)

a=require("")的a取決於這個匯入的檔案的返回值,沒有返回值時true,所以在標準的情況下模組的結尾應該return這個模組的名字,這樣a就是這個模組的table了(當然不這樣做也ok,只是a就不是這個模組名了)

本文出自:

lua程式設計 全域性變數 環境 模組

1.全域性變數與環境 lua中真正儲存全域性變數的地方不是在 g裡面,而是在setfenv i,table 的table中,所有當前的全域性變數都在這裡面找,只不過在程式開始時lua會預設先設定乙個變數 g 這個裡面的table而已。所以在新設定環境後,如果還想找到之前的全域性變數,通常需要附加上為...

Nodejs fs模組 全域性變數

fs模組提供了用於與檔案進行互動相關方法 const fs require fs 寫入資料 fs.writefile 檔案,資料,err 讀取檔案中資料 fs.readfile 檔案 utf8 err,data 檢查檔案是否存在 返回 true false fs.existssync path 獲取...

Lua 全域性變數和區域性變數

在lua中宣告乙個全域性變數很簡單 a 5直接賦值就可以,而且也不會限制變數的型別,我們可以直接把number型別的變數賦值string a hello 宣告乙個區域性變數需要在前面加上關鍵字 local local b 10區域性變數在當前 塊結束後就會銷毀 用do end命令建立乙個 塊 do ...