lua学习之全局变量

Lua中的全局变量存储在_G表中,虽然方便小规模程序但可能导致大型程序的bug。文章介绍了两种全局变量的处理方法,包括允许全局变量为nil和通过metatable控制全局访问。此外,提及了在LUA5.0中,每个函数可以拥有独立的环境,并讨论了setfenv函数用于改变函数环境的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

全局变量保存在_G表中。

全局变量不需要声明,对小的程序很方便。当程序很大时,可能会导致很难发现的bug.

方法1:

function declare(name, initval )
	rawset(_G, name, initval or false)   --rawset是会绕过metamethod的
end
setmetatable(_G, {

	__newindex = function (_, n)
		error("attempt to write to undeclared variable "..n,2)
	end,

	__index = function (_, n)
		error("attempt to read undeclared variable "..n,2)
	end,
})

--测试
declare("a")
a = 1
print(a)

方法2:允许全局变量可以为nil

local declareNames = {}
function declare(name, initval)
	rawset(_G, name, initval)
	declareNames[name] = true
end

setmetatable(_G, {

	__newindex = function(t, n, v)
		if not declareNames[n] then
			error("attempt to write to undeclared var."..n,2)
		else
			rawset(t, n, v)
		end
	end,

    __index  = function (_, n)
    	print("attempt to read n")
    	if not declareNames[n] then
    		error("attempt to read undeclared var."..n,2)
    	else
    		return nil
    	end
    end, 	
	})
--测试
declare "a"
a=1
print(a)

非全局环境:

当安装metatable去控制全局访问时,你的整个程序都会受影响。 LUA5.0 允许每个函数有自己的环境。使用setfenv,接受函数和新的环境为参数,还可以使用数字表示栈顶活动的函数,数字1表示当前的函数,数字2表示调用当前函数的函数。

local newgt = {}  --create new environment
setmetatable(newgt, {__index = _G})
setfenv(1, newgt)
declare "a"
a = 1
print(_G.a)    --输出为nil
print(newgt.a) --输出为1
这段代码继承了旧环境的print. a是新环境下的全局变量。任何赋值操作是对新表进行,不用担心误操作修改了全局变量表_G. 不过你仍然可以通过_G修改全局变量。 例如:_G.c=10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值