lua语言的闭包设计和LClosure解读

news2024/12/26 23:45:13

在这里插入图片描述

什么是闭包

闭包是一种特殊的函数,它可以访问其创建时所处的环境中的变量,即使在函数创建后,环境已经不再存在,这些变量仍然可以被访问。

为了更好地理解闭包,我们可以看一个例子:

function counter()
  local count = 0
  return function()
           count = count + 1
           return count
         end
end

c1 = counter()
print(c1())  --> 1
print(c1())  --> 2
print(c1())  --> 3

在这个例子中,我们定义了一个函数counter,它返回一个匿名函数。这个匿名函数可以访问counter函数中的局部变量count,即使counter函数已经返回,count变量仍然可以被访问和修改。这就是一个闭包。

当我们调用counter函数时,它会创建一个新的局部变量count,并返回一个匿名函数。每次调用这个匿名函数时,它会将count变量加1,然后返回新的值。由于这个匿名函数是闭包,它可以访问count变量,因此每次调用c1()时,它都会返回一个递增的值。

闭包的作用非常强大,它可以帮助我们实现一些高级的编程技巧和语言特性,例如函数柯里化、延迟计算、回调函数等。同时,也需要注意闭包可能导致内存泄漏等问题,因此在使用闭包时需要谨慎处理。

count是局部为何累计?

是的,countcounter函数中的局部变量,但是由于闭包的特性,内部函数可以访问到外部函数的局部变量。

在这个例子中,当我们调用counter()函数时,它返回一个匿名函数,这个匿名函数可以访问counter函数中的局部变量count,并且这个匿名函数被赋值给变量c1。因此,每次调用c1()时,它都会访问count变量,并将其加1。

由于count变量是在counter函数中定义的局部变量,因此它的生命周期与counter函数的生命周期相同。但是,由于c1变量持有了这个匿名函数,所以即使counter函数已经返回,count变量仍然可以被访问和修改,因此每次调用c1()时,它都会返回一个递增的值。

这就是闭包的特性。闭包可以访问其创建时所处的环境中的变量,即使在函数创建后,环境已经不再存在,这些变量仍然可以被访问。在上面的例子中,匿名函数形成了一个闭包,它可以访问counter函数中的局部变量count,即使counter函数已经返回,count变量仍然可以被访问和修改。

LClosure的作用

在Lua中,LClosure是表示Lua函数闭包的一种类型。闭包是一种特殊的函数,它可以访问其创建时所处的环境中的变量,即使在函数创建后,环境已经不再存在,这些变量仍然可以被访问。

LClosure数据结构中包含了一个函数原型(Proto)和一个环境表(upvalue),函数原型中存储了函数的指令、常量、局部变量和调试信息等,环境表中存储了函数所需的外部变量,也就是闭包所依赖的变量。

LClosure的主要作用是实现Lua中的闭包功能。Lua中的闭包非常强大,它允许程序员创建具有动态特性的函数,可以将函数作为值传递给其他函数,可以在函数内部定义函数等。闭包还可以用于实现一些高级的语言特性,例如函数柯里化、延迟计算、回调函数等。

具体来说,当一个函数需要访问其外部的变量时,Lua会将这些变量捕获到闭包中,并将闭包作为函数的环境表。这样,当函数被调用时,它可以使用这些外部变量,即使它们不在函数的作用域内。

【最后一个bug】多平台都有更新和发布,大家可以一键三连,关注+星标,不错过精彩内容~
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/656442.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Appium知多少

Appium我想大家都不陌生,这是主流的移动自动化工具,但你对它真的了解么?为什么很多同学搭建环境时碰到各种问题也而不知该如何解决。 appium为什么英语词典查不到中文含义? appium是一个合成词,分别取自“applicatio…

OpenAI官方提示词课(七)制作一个聊天机器人

大型语言模型的一个令人兴奋的方面是,你可以利用它来构建一个定制的聊天机器人,并且只需付出少量的努力。ChatGPT 的网页界面可以让你与一个大型语言模型进行对话。但其中一个很酷的功能是,你也可以利用大型语言模型构建你自己的定制聊天机器…

案例 | 标杆引领!人大金仓智绘数字金融

随着中央数字经济政策推进金融业数字化建设,数字金融已初见成效,但尚存在信息安全缺乏保障、转型覆盖不全面等问题。 为实现金融行业全面数字化转型升级,作为数据库领域国家队,人大金仓紧跟国家战略,自主研发的系列数据…

msvcp110.dll丢失原因——msvcp110.dll丢失怎么修复(最新可修复)

昨天卸载了一个垃圾软件以后,我的其他软件就无法打开运行,提示msvcp110.dll丢失,无法继续执行此代码。今天早上找了很多方法,终于把msvcp110.dll丢失的原因以及修复的方法都弄明白了。msvcp110.dll是一个非常重要的文件&#xff0…

【CVE-2022-0185】Linux kernel [文件系统挂载API] 堆溢出漏洞分析与利用

0x00.一切开始之前 CVE-2022-0185 是 2022 年初爆出来的一个位于 filesystem context 系统中的 fsconfig 系统调用中的一个堆溢出漏洞,对于有着 CAP_SYS_ADMIN 权限(或是开启了 unprivileged namespace)的攻击者而言其可以利用该漏洞完成本地…

Hugging News #0616: 有几项非常重要的合作快来围观、最新中文演讲视频回放发布!...

每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等,我们将其称之为「Hugging News」,本期 Hugging News 有哪些有趣的消息…

【MySQL】SQL的函数用法

文章目录 聚合函数Count()Max()Min()Sum()Avg() 其他常用函数时间函数字符串函数SUBSTRING函数:切割字符串([start:end])SUBSTRING_INDEX函数:切割字符串(split)LOWER&UPPER函数:大小写转化CONCAT&CONCAT_WS函数:连接字符串REPLACE函数:字符串替换 数学函数ROUND函数:四…

rhce8考试

rhce考试模拟环境准备: cat /etc/rht 确认当前是否为294环境,真实考试有5台被管理节点,借助bastion当做第5台。 将考试所需的文件放到这个目录,/content/courses/rh294/rhel8.0/materials目录,虚拟机看br0网卡信息ifc…

使用LOAD DATA INFILE命令加载数据文件到MySQL数据库的方法和常见错误及解决方法

文章目录 使用LOAD DATA INFILE命令加载数据文件到MySQL数据库的方法和常见错误及解决方法LOAD DATA INFILE的语法详细1.创建(选择)目标数据库和表2.将数据从 CSV 文件导入已创建的表常见错误和解决方法错误1:ERROR 1290 (HY000): The MySQL …

linux_centos7.9/ubuntu20.04_下载镜像及百度网盘分享链接

1、镜像下载站点 网易开源镜像:http://mirrors.163.com/ 搜狐开源镜像:http://mirrors.sohu.com/ 阿里开源镜像:https://developer.aliyun.com/mirror/ 首都在线科技股份有限公司:http://mirrors.yun-idc.com/ 常州贝特康姆软件技…

TFTP是什么,一文带你了解

目录 一、TFTP协议简介 TFTP协议的主要特点包括: 二、TFTP包格式 1. 读/写请求包 2. 文件数据包 3. 回应包 4. 错误信息包 三、TFTP的工作流程 TFTP协议的工作流程包括以下几个步骤: 四、TFTP的传输模式 1. 二进制传输模式 2. ASCII码传输模式…

【Spring】1、Spring 框架的基本使用【读取配置文件、IoC、依赖注入的几种方式、FactoryBean】

目录 一、Spring 简介二、读取配置文件、创建对象三、使用 Spring(1) 依赖(2) Spring 的核心配置文件(3) 获取 Spring IoC 工厂中的对象实例 四、IoC 容器五、依赖注入(DI)(1) 基于 setter 注入【bean】(2) 基于 setter 注入【基本类型、包装类型、Strin…

理解空穴电流

理解空穴电流 近日闲来无事,翻起来模电看了起来,在看到关于三极管的一张图时,对三极管的 I E P {I}_{EP} IEP​电流无法理解。 I E P {I}_{EP} IEP​电流,教材上的解释是基区空穴形成的空穴电流。 于是我就收集了相关资料&#…

NVIDIA Jetson Orin™ 与其他 NVIDIA Jetson 模组的区别

NVIDIA Jetson Orin™ 与其他 NVIDIA Jetson 模组的区别 在本系列关于 NVIDIA Jetson AGX Orin 的前几版中,我们了解了 AGX Orin 是什么、它的技术特性、主要构建模块和关键的嵌入式视觉用例。以下是这两篇文章的链接: 什么是 NVIDIA Orin 系列&#xf…

3D线段SFM建图

文章:3D Line Mapping Revisited 作者:Shaohui Liu,Yifan Yu,Remi Pautrat ,Marc Pollefeys,Viktor Larsson 编辑:点云PCL 代码: https://github.com/cvg/limap(CVPR 20…

Visual Studio无法拖入文件解决办法

原因:当windows账户为个人账户(即使带有管理员字眼),如果vs以“管理员”运行就会限制文件拖入,此时软件左上角显示“管理员”字眼 这种情况可能是你在运行vs时选了“以管理员身份运行”,也可能是快捷方式设…

深入理解Java虚拟机jvm-对象的访问定位

对象的访问定位 句柄直接指针优劣句柄直接指针 创建对象自然是为了后续使用该对象,我们的Java程序会通过栈上的reference数据来操作堆上的具 体对象。由于reference类型在《Java虚拟机规范》里面只规定了它是一个指向对象的引用,并没有定义这个引用应该通…

蓝牙技术原理(9)蓝牙AOA/AOD技术原理

文章目录 1 AOA/AOD的概述1.1 AOA(达到角)1.2 AOD(出发角) 2 AOA整体系统搭建3 IQ信号讲解3.1 阵列天线的切换模型3.2 CTE 数据包特征3.3 CTE 数据包具体格式3.4 相位角的计算 4 到达角度的计算5 确定tag的坐标 1 AOA/AOD的概述 BLE 5.1 有个特性加入了…

docker系列4:docker容器基本命令

传送门 前面介绍了docker的安装:docker系列1:docker安装 还有docker镜像加速器:docker系列2:阿里云镜像加速器 以及docker的基本操作: docker系列3:docker镜像基本命令 引子 从今年3月到现在&#xff…