《Lua程序设计》-- 学习10

环境(Environment)

具有动态名称的全局变量

全局变量的声明

由于Lua语言将全局变量存放在一个普通的表中,所以可以通过元表来发现访问不存在全局变量的情况。

正如前面所提到的,我们不允许值为nil的全局变量,因为值为nil的全局变量都会被自动地认为是未声明的。但是,要允许值为nil的全局变量也不难,只需要引入一个辅助表来保存已声明变量的名称即可。一旦调用了元方法,元方法就会检查该表,看变量是否是未声明过的。最终的代码可能与示例22.2中的代码类似。

现在,即使像x=nil这样的赋值也能够声明全局变量了。

非全局环境

在Lua语言中,全局变量并不一定非得是真正全局的。Lua语言竭尽全力地让程序员有全局变量存在的幻觉

一个自由名称(free name)是指没有关联到显式声明上的名称,即它不出现在对应局部变量的范围内。例如,在下面的代码段中,x和y是自由名称,而z则不是:

Lua语言把所有的代码段都当作匿名函数。所以,Lua语言编译器实际上将原来的代码段编译为如下形式:也就是说,Lua语言是在一个名为_ENV的预定义上值(一个外部的局部变量,upvalue)存在的情况下编译所有的代码段的。因此,所有的变量要么是绑定到了一个名称的局部变量,要么是_ENV中的一个字段,而_ENV本身是一个局部变量(一个上值)。

_ENV的初始值可以是任意的表(实际上也不用一定是表,我们会在后续讨论)。任何一个这样的表都被称为一个环境。为了维持全局变量存在的幻觉,Lua语言在内部维护了一个表来用作全局环境(global environment)。通常,当加载一个代码段时,函数load会使用预定义的上值来初始化全局环境。因此,原始的代码段等价于:

Lua语言中处理全局变量的方式:

•编译器在编译所有代码段前,在外层创建局部变量_ENV;

•编译器将所有自由名称var变换为_ENV.var;

•函数load(或函数loadfile)使用全局环境初始化代码段的第一个上值,即Lua语言内部维护的一个普通的表。

使用_ENV

环境和模块

函数load通常把被加载代码段的上值_ENV初始化为全局环境。不过,函数load还有一个可选的第四个参数来让我们为_ENV指定一个不同的初始值。

垃圾收集

弱引用表(weak table)、析构器(finalizer)和函数collectgarbage是在Lua语言中用来辅助垃圾收集器的主要机制。弱引用表允许收集Lua语言中还可以被程序访问的对象;析构器允许收集不在垃圾收集器直接控制下的外部对象;函数collectgarbage则允许我们控制垃圾收集器的步长。

弱引用表

简单地清除引用可能还不够。在有些情况下,还需要程序和垃圾收集器之间的协作。一个典型的例子是,当我们要保存某些类型(例如,文件)的活跃对象的列表时。这个需求看上去很简单,我们只需要把每个新对象插入数组即可;但是,一旦一个对象成为了数组的一部分,它就再也无法被回收了!虽然已经没有其他任何地方在引用它,但数组依然在引用它。除非我们告诉Lua语言数组对该对象的引用不应该阻碍对此对象的回收,否则Lua语言本身是无从知晓的。

弱引用表就是这样一种用来告知Lua语言一个引用不应阻止对一个对象回收的机制。所谓弱引用(weak reference)是一种不在垃圾收集器考虑范围内的对象引用。如果对一个对象的所有引用都是弱引用,那么垃圾收集器将会回收这个对象并删除这些弱引用。Lua用语言通过弱引用表实现弱引用,弱引用表就是元素均为弱引用的表,这意味着如果一个对象只被一个弱引用表持有,那么Lua语言最终会回收这个对象。

表由键值对组成,其两者都可以容纳任意类型的对象。在正常情况下,垃圾收集器不会回收一个在可访问的表中作为键或值的对象。也就是说,键和值都是强(strong)引用,它们会阻止对其所指向对象的回收。在一个弱引用表中,键和值都可以是弱引用的。这就意味着有三种类型的弱引用表,即具有弱引用键的表、具有弱引用值的表及同时具有弱引用键和值的表。不论是哪种类型的弱引用表,只要有一个键或值被回收了,那么对应的整个键值对都会被从表中删除。

一个表是否为弱引用表是由其元表中的__mode字段所决定的。当这个字段存在时,其值应为一个字符串:如果这个字符串是"k",那么这个表的键是弱引用的;如果这个字符串是"v",那么这个表的值是弱引用的;如果这个字符串是"kv",那么这个表的键和值都是弱引用的。

在本例中,第二句赋值key={}覆盖了指向第一个键的索引。调用collectgarbage强制垃圾收集器进行一次完整的垃圾收集。由于已经没有指向第一个键的其他引用,因此Lua语言会回收这个键并从表中删除对应的元素。然而,由于第二个键仍然被变量key所引用,因此Lua不会回收它。

请注意,只有对象可以从弱引用表中被移除,而像数字和布尔这样的“值”是不可回收的。例如,如果我们在表a(之前的示例)中插入一个数值类型的键,那么垃圾收集器永远不会回收它。当然,如果在一个值为弱引用的弱引用表中,一个数值类型键相关联的值被回收了,那么整个元素都会从这个弱引用表中被删除。

记忆函数(Memorize Function)

我们可以通过记忆(memorize)函数的执行结果,在后续使用相同参数再次调用该函数时直接返回之前记忆的结果,来加快函数的运行速度

对象属性(Object Attribute)

弱引用表的另外一种重要应用是将属性与对象关联起来。在各种各样的情况下,我们都需要把某些属性绑定到某个对象,例如函数名、表的默认值及数组的大小等。

瞬表

在Lua语言中,一个具有弱引用键和强引用值的表是一个瞬表。在一个瞬表中,一个键的可访问性控制着对应值的可访问性。更确切地说,考虑瞬表中的一个元素(k,v),指向的v的引用只有当存在某些指向k的其他外部引用存在时才是强引用,否则,即使v(直接或间接地)引用了k,垃圾收集器最终会收集k并把元素从表中移除。

析构器(Finalizer)

虽然垃圾收集器的目标是回收对象,但是它也可以帮助程序员来释放外部资源。出于这种目的,几种编程语言提供了析构器。析构器是一个与对象关联的函数,当该对象即将被回收时该函数会被调用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python_ACM模式《剑指offer刷题》链表4

题目: 面试tips: 询问是否需要判断环,可微调下方代码。 思路: 思路一: 判断环是否存在:设定一快一慢指针,均从头节点出发,快指针一次走两步,慢指针一次走一步。若无环…

如何本地部署hMailServer邮件服务并实现远程发送邮件【内网穿透】

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默&…

CDS view与替代对象

一,简介 替代对象是指用一个CDS view指派给一个透明表或常规数据库视图,使得透明表或常规数据库视图的访问重定向到该CDS view。 替代有诸多要求: 字段数量一致且同名对应,顺序可以不一致对应的字段数据类型长度等必须一致CDS v…

AJAX-接口文档

接口文档:由后端提供的描述接口的文章 接口:使用AJAX和服务器通讯时,使用的URL,请求方法,以及参数 1.请求参数的位置为query(查询)的时候,就说明要使用params写为查询参数 2.请求参…

unity WebGL发布游戏生成WebGL

1.unty Hub中安装WEBGL支持 2.项目平台的切换 color space需要根据项目选择 ColorSpace,是指玩家设置的颜色空间。 伽马颜色空间是历史悠久的标准格式,但线性颜色空间渲染可提供更精确的结果。 具体区别:ColorSpace 3.由于没有自己服务器…

reactnative 调用原生ui组件

reactnative 调用原生ui组件 ![组件对应关系](https://img-blog.csdnimg.cn/direct/c4351ad7bd38411e9c13087f1059a4b0.png)1.该样例已textView,介绍。 新建MyTextViewManager 文件,继承SimpleViewManager。import android.graphics.Color; import andr…

《PCI Express体系结构导读》随记 —— 第II篇 第4章 PCIe总线概述(5)

接前一篇文章:《PCI Express体系结构导读》随记 —— 第II篇 第4章 PCIe总线概述(4) 4.1.2 PCIe总线使用的信号 PCIe设备使用两种电源信号供电,分别是Vcc与Vaux,其额定电压为3.3V。其中Vcc为主电源,PCIe设备…

关闭idea之后,项目还在运行,端口被占用

今天在写项目的时候,中途安装了一个插件,而且插件显示需要重启idea,重启的时候项目正在运行,重启之后发现idea没有显示有项目正在运行,当我要开启项目的时候,发现无法开启,显示端口被占用了&…

STM32学习笔记(六) —— 配置系统时钟

1.时钟树 从图中可以看出一共有四个时钟来源,分别是内部高速时钟、内部低速时钟、外部高速时钟接口、外部低速时钟接口,这些时钟源经过内部的倍频分频后提供给各外设使用。其中HSE与LSE需要由外部提供,可以是外部时钟直接输入,也可…

「效果图渲染」效果图与3D影视动画渲染平台

效果图渲染和3D影视动画渲染都是视觉图像渲染的领域应用。效果图渲染主要服务于建筑、室内设计和产品设计等行业,这些领域通常对视觉呈现的精度和细节有较高要求。与之相比,3D影视动画渲染则普遍应用于电影、电视、视频游戏和广告等媒体领域,…

力扣461. 汉明距离(位运算)

Problem: 461. 汉明距离 文章目录 题目描述思路复杂度Code 题目描述 思路 Problem: 力扣191. 位1的个数(位运算) 该题只需要在上题的基础上先对两个数进行一次异或操作即可 复杂度 时间复杂度: O ( 1 ) O(1) O(1) 空间复杂度: O ( 1 ) O(1) O(1) Code …

【linux】linux环境变量-详解-备查

【linux】linux环境变量-详解-备查 一、类型 **永久变量:**通过修改配置文件,配置之后变量永久生效。 用户变量(局部变量):修改的设置只对某个用户的路径或执行起作用; 在用户目录下的.bash_profile文件…

GPT-4这么厉害,能替代中之人吗?我们找虚拟偶像粉聊了聊

本文为 澎湃号湃客 至顶头条 联合出品 作者 | 张晓迪 编辑 | 王恒婷 就在人们还在讨论ChatGPT如何商业化时,GPT-4直接给出了答案。 3月17日凌晨,在GPT-4发布后的48小时,微软Office全家桶也带着GPT-4生成的Copilot来到办公室里给打工人“减负”了。 多模态大型语言模型…

【教程】谈一谈 IPA 上传到 App Store Connect 的几种方法

引言 在应用开发过程中,将应用程序上传到 App Store Connect 是一个关键的环节。本文将探讨几种常见的 IPA 文件上传方法,包括 Xcode、Application Loader、altool、Appuploader以及Transporter。通过本文的介绍和指导,读者将能够了解不同的…

看完这篇文章,你一定能看懂Datasheet!

大家好,我是砖一。 针对以上学妹的疑问,我有几点建议,大家可以听一下~ 一,怎么样查找Datasheet(数据手册) 大多数人下意识就点开浏览器,把型号往里面一输,不建议这样。 对于刚入行…

文心一言APP推出新功能:数字分身,只需一张照片和三句话即可创建自己的电子替身

文心一言APP近日推出了一项炸裂的新功能:数字分身。这一创新技术让用户通过一张照片和三句语音录制,轻松创建属于自己的数字分身。这一功能降低了数字分身技术的门槛,让更多人能够体验到个性化的虚拟形象。华为手机市场直接搜“文心一言”就可…

uniapp中组件库Mask 遮罩层 的使用方法

目录 #平台差异说明 #基本使用 #嵌入内容 #遮罩样式 #API #Props #Events #Slot 创建一个遮罩层,用于强调特定的页面元素,并阻止用户对遮罩下层的内容进行操作,一般用于弹窗场景 #平台差异说明 AppH5微信小程序支付宝小程序百度小程…

【TikTok选品】一周创下两百万销售额!这款小小遮瑕膏,如何从美区美妆市场杀出重围?

新年新气象。2024年以来,美区销售额周榜常有黑马,看得出卖家都卯足了劲在新的一年打下更亮眼的业绩。超店有数观察了TikTok选品数据,监测到上周TikTok美区就有一个新品在竞争激烈的美妆市场中杀出重围,在一周内创下200万美金的超高…

智慧工地可视化综合管理云平台 PC+APP

目录 一、智慧工地可视化数据大屏功能一览 1.首页 2.视频监控 3.机械设备 4.环境监测 5.安全管理 6.质量管理 7.劳务分析 8.进度管理 9.报警统计 二、项目人员管理 1.信息管理 2.信息采集 3.证件管理 危大工程管理 一、智慧工地可视化数据大屏功能一览 包括&am…

第二期《计算机视觉处理设计开发工程师》的培训通知

近日我们刚刚结束了《计算机视觉处理设计开发工程师》证书第一期培训,培训效果良好,所有学员均通过工信部统一线上考试,坐等证书了。鉴于学员们的反应我们第二期课程如约而至。 证书出台背景:为进一步贯彻落实中共中央印发《关于深…
最新文章