最近在學lua5.3 發現裡面的_g和_env的概念容易混淆,花了點時間理了一下,現在做個筆記以防後面忘記,直接用**例子說明
test_env.lua:
local local_var = "local_var"
-- 該變數為該模組的區域性變數
global_var = "global_var"
-- 該變數為全域性變數註冊在 _g 中
-- print("_env.local_var:", _env.local_var) -- 這句證明 local 變數不存在於 _env 中
test_env = {} -- 如果這裡設為 local 則不能在 require 一次後在其他檔案中直接呼叫 test_env 後面會說明
setmetatable(test_env, ) -- 設定 _g 是為了使用 print 函式還有驗證上面的 global_var
_env = test_env -- 改變當前環境
local env_local_var = "env_local_var"
env_globar_var = "env_global_var"
-- 注意這裡不是存在 _g 而是在 _env
print("local_var:", local_var)
print("global_var:", global_var)
print("env_local_var:", env_local_var)
print("env_global_var:", env_global_var)
print("test_env:", test_env)
print("_g:", _g)
print("_g.local_var = nil result:", _g.local_var)
print("_g.global_var = global_var result:", _g.global_var)
print("_g.test_env = test_env(addr) result:", _g.test_env)
print("_g.env_local_var = nil result:", _g.env_local_var) -- 該變數為區域性變數所以 _g 中沒有
print("_g.env_global_var = nil result:", _g.env_global_var) -- 該變數在 _env 中
print("_env._g = _g(addr) result:", _env._g)
print("_env.local_var = nil result:", _g.local_var)
print("_env.env_local_var = nil result:", _env.env_local_var)
print("_env.env_global_var = env_global_var result:", _env.env_global_var)
return test_env
test.lua:
local env = require
"test_env"
print("")
print("")
print("env: ", env)
print("test_env: ", test_env)
print("_g.test_env: ", _g.test_env)
print("env.local_var = nil result:", env.local_var)
print("env.global_var = global_var result:", env.global_var) -- 這裡的 global_var 其實是 _g.global_var
print("_g.global_var = global_var result:", _g.global_var)
print("env.env_local_var = nil result:", _g.env_local_var)
print("env.env_global_var = nil result:", _g.env_global_var)
print("test_env.env_local_var = nil result:", test_env.env_local_var) -- 這裡是 _g.test_env.env_local_var
print("test_env.env_global_var = env_global_var result:", test_env.env_global_var) -- 這裡是 _g.test_env.env_local_var 如果test_env.lua中 test_env 變數前面加上 local 這裡就不能這麼用
lua5 2 帶你理解 ENV和 G
5.1之前,全域性變數儲存在 g這個table中,這樣的操作 a 1 相當於 g a 1 但在5.2之後,引入了 env叫做環境,與 g全域性變數表產生了一些混淆,需要從原理上做乙個理解。在5.2中,操作a 1 相當於 env a 1 這是乙個最基礎的認知改變,其次要格外注意 env不是全域性變數,...
Lua學習筆記 lua堆疊
首先了解一下c 與lua之間的通訊 假設在乙個lua檔案中有如下定義 hello.lua檔案 請注意紅色數字,代表通訊順序 1 c 想獲取lua的myname字串的值,所以它把myname放到lua堆疊 棧頂 以便lua能看到 2 lua從堆疊 棧頂 中獲取myname,此時棧頂再次變為空 3 lu...
lua學習筆記
近日時間比較充裕,學習一下lua語言,順便寫下筆記,方便以後加深學習。c c 呼叫lua動態庫及標頭檔案位址 用於c c 嵌入lua指令碼解析 也可以到或找適合自己的版本。一 hello world 哈哈,先使用經典的hello world帶進門 1.在 執行 鍵入cmd開啟dos視窗,並將當前目錄...