Lua学习之闭包概念

本文深入探讨Lua中闭包的概念,通过实例解析闭包与upvalue的关系,解释闭包如何保存局部变量并在后续调用中访问这些变量。

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

学习Lua的迭代器的时候有个闭包的概念,这个很特别。

Lua中的函数是一阶值,就是说函数可以作为参数,返回值,可以作为右值赋给变量。那么在一个函数内就可以再定义函数,就像定义一个变量一样。内部函数可以访问外部函数的局部变量,这种变量又叫upvalue。闭包的实现关键就是这个upvalue。

简单来区分函数和闭包的区别。可以说函数是特殊的闭包,而闭包不是函数。闭包是函数和起运行环境的整体。

写个例子:

function newCounter()
local i = 0
return function()
i = i+1
return i
end
end
c1=newCounter()
print(c1())
print(c1())
看这段代码,匿名函数访问一个upvalue i,这个变量用来保存一个计数器。第一次调用的时候肯定会打印1。第二次调用会打印多少呢。答案是2。

我的理解是,闭包是函数和他的upvalue组成的整体。我不知道这个upvalue变量是怎么实现的,网上有资料说是这个变量会被保存在堆栈,调用的时候会创建其副本,不管怎么样,闭包的外在表现就是可以保存这个upvalue变量,后续调用可以访问这个变量。

如果有兴趣可以看起源码实现。

不知道说清楚了没有,就当做个笔记吧。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值