lua闭包的理解以及表与函数的几种表达方法
Lua闭包是函数及其捕获的上值(外部局部变量)的组合,上值生命周期随闭包延长。表内函数有匿名赋值、构造式定义、函数名绑定三种等价写法,均创建闭包。闭包实现数据隐藏和回调,是Lua函数式编程基础。
前一阵子学 Lua,翻中文教程读到“闭包”那一节,反反复复看了好几遍,脑子里还是模模糊糊的——到底什么是闭包?跟 close 应该没关系吧?好吧,承认一开始是有点想当然,以为闭包就是个什么关闭函数之类的东西。越往下翻越懵,后来在网上翻了不少大佬的讲解,才慢慢理出头绪。这篇笔记就是当时记下来的,免得以后再犯迷糊。

在 Lua 里,函数本身就是一种变量。它能被存到表里,也能当作参数传出去,还能作为返回值返回来。而所谓闭包,说得通俗点,可以理解成这么一个结构:闭包(函数名){功能抽象, upvalue, env}。功能抽象就是函数体本身,而 upvalue 是关键。
什么是 upvalue?简单说,如果一个内嵌函数用到了外部函数中定义的那些局部变量,这些变量就被叫做内嵌函数的“外部局部变量”,也就是 upvalue。注意,upvalue 指的是变量本身,而不是变量当前的值。
function newCounter() local i = 0 return function() i = i + 1 return i end end
上面这个例子里的 i,就是一个 upvalue。
所以闭包的本质可以概括为:一个函数 + 它能正确访问的所有 upvalue。upvalue 通常是嵌套函数外部那个函数的局部变量。闭包一般定义在另一个函数内部,它可以访问外部函数里的成员变量、参数,甚至是全局函数。最关键的是,这个内部函数还能被当作返回值扔出去,在外面被调用——这就把外部函数的那片局部变量“包”住了,逃不掉。
再来说说表和函数的几种常见写法。其实在 Lua 里,把函数塞进表是很自然的事,下面三种方式效果完全一样:
第一种:
Lib = {}
Lib.foo = function (x,y) return x+ y end
Lib.goo = function(x) return x end
第二种:
Lib = {
foo = function (x,y) return x+ y end,
goo = function(x) return x end
}
第三种:
Lib = {}
Lib = {}
function Lib.foo (x,y) return x+ y end
function Lib.goo (x) return x end
这三种写法本质上都是把匿名函数赋给表的字段,或者直接用函数名绑定。实际工作中用哪一种,看个人习惯和代码风格。重点是把闭包和表函数的机制理解透,写 Lua 的时候才能真正心里有底。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















