Lua 学习笔记——_ENV和_G

Lua 学习笔记——_ENV和_G

最近在学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, {__index = _G})  -- 设置 _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 这里就不能这么用

你可能感兴趣的:(lua)