Lua程序设计(七十二)

本文介绍了Lua中如何访问和更新非局部变量,包括getupvalue和setupvalue函数的使用,以及在处理局部变量、非局部变量和全局变量时的查找逻辑和避免无限递归的方法。
摘要由CSDN通过智能技术生成

访问非局部变量

调试库还提供了函数 getupvalue, 该函数允许我们访问一个被 Lua 函数所使用的非局部变量。与局部变量不同,被一个函数所调用的非局部变量即使在引用它的函数已经不活跃的情况下也会一直存在(闭包的实质)。因此,函数 getupvalue 的第一个参数不是栈层次,而是一个函数(更确切地说,是一个闭包)。函数 getupvalue 的第二个参数时变量索引,Lua 语言按照函数引用非局部变量的顺序对它们进行编号,但由于一个函数不能用同一名称访问两个非局部变量,所以实际上这个顺序是无关紧要的。

通过函数 debug.setupvalue 可以更新非局部变量的值。这个函数有三个参数: 一个闭包、一个变量索引和一个新值。 与函数 setlocal 一样,该函数返回变量名,如果变量索引超出范围则返回 nil

function getvarvalue (name, level, isenv)
	local value
	local found = false
	
	level = (level or 1)  + 1
	for i = 1, math.huge do
		local n, v = debug.getlocal(level, i)
		if not n then break end
		if n == name then
			value = v
			found = true
		end
	end
	if found then return "loca
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值