【查看微信源码】【工程在线计算源码】【云平台管理源码】精致源码_精致源码H5松鼠大厅最新版本更新内容

时间:2024-11-21 02:22:59 编辑:tvbox源码打包 来源:助推拓客源码

1.Python浪漫表白源码合集(爱心、精致精玫瑰花、源码源码照片墙)
2.C语言C++情人节红玫瑰代码
3.学习C语言 必看的书籍
4.7个源代码/库搜索引擎网站
5.九款好看的松鼠后台管理系统登录模板
6.短视频直播源码,EditText输入框的厅最使用

精致源码_精致源码H5松鼠大厅最新版本更新内容

Python浪漫表白源码合集(爱心、玫瑰花、新版新内照片墙)

       程序员浪漫的本更查看微信源码一面,通过Python语言展现出来。精致精以下是源码源码一些Python代码实现的浪漫元素,让你的松鼠表白更加独特且充满创意。

       首先,厅最让我们用一行代码画出一个爱心。新版新内这不仅简单,本更而且能够快速表达出爱意。精致精

       在代码的源码源码帮助下,一个爱心瞬间呈现眼前,松鼠为你的表白增添一抹温情。

       接下来,使用Python的turtle库来绘制一个爱心,并在其中加入浪漫的文字。这样,你可以在表白的同时,向她/他传达更深的情感。

       通过精心设计的代码,一个充满爱意的爱心与文字组合展现在你眼前。将情感融入代码之中,让表白更具个人特色。

       如果你希望将这份浪漫以更便捷的方式传递给未接触过Python的朋友,不妨将代码生成的图形封装成exe文件。这样,只需简单一步点击,无需额外安装Python环境,即可在对方的电脑上欣赏到这份浪漫。

       此外,使用turtle库不仅能够画出爱心和文字,还能绘制出一朵美丽的玫瑰花。给这份表白增添一份细腻和精致,让浪漫氛围更加浓郁。

       为了将这份浪漫长久保存,我们可以使用Python生成一张照片墙,用以纪念一段美好的回忆。例如,工程在线计算源码以《香蜜》剧中的作为素材,精心布局成一张照片墙,每一格都包含一张照片,为你和心爱的人留下珍贵的记忆。

       通过Python的代码,你不仅能够绘制出美丽的爱心、玫瑰花,还能生成一张充满回忆的照片墙。这些浪漫的元素,能够让你的表白更加个性化和独特。

       无论是通过一行代码画出爱心,还是使用Python的turtle库绘制浪漫的图形,亦或是生成一张充满回忆的照片墙,Python语言都能成为你表达爱意的有力工具。让你的表白更加具有创意,让这段故事成为独一无二的记忆。

C语言C++情人节红玫瑰代码

       在浪漫的情人节里,让我们用C++为爱人献上一朵独特的红玫瑰。首先,来看看最终的绘制效果,从初始的形态到盛开的美丽,绝对能打动人心。

       要实现这个,我们需要准备相应的图形库头文件,这是基础。接下来,定义一些全局变量和结构体,这些是构建花朵各部分的关键。

       计算花的主体,包括精致的花柄、优雅的花萼、翠绿的叶子和盛开的花瓣,每一步都需要精确的编程技巧。花的每个细节,都蕴含着对爱的细腻表达。

       最后,让我们步入主函数,将所有的元素整合起来,创造出这朵专属于情人节的红玫瑰。无论你是云平台管理源码C/C++新手还是经验丰富的程序员,这个过程都能增进技术与情感的交融。

       如果你对源代码感兴趣,可以加入我们的学习交流群获取。这里有丰富的学习资料和互助氛围,无论你是大学生、前端开发者还是职场人士,这里都是提升C/C++技能的好地方。祝愿每位程序员都能在代码的海洋中找到属于自己的浪漫,用编程的力量实现梦想,走向技术的巅峰。祝愿大家的情人节表白都能收获满满的爱意!

学习C语言 必看的书籍

       Brian W.Kernighan, Dennis M.Ritchie,《C程序设计语言》

        清华影印版、习题集;机械译文版(新版、老版):习题集

        这是迄今为止在所有程序设计语言书籍中最广受尊敬的一部经典,是任何一名C程序员的必读之作。因为出自C语言的设计者Dennis M.Ritchie和著名的计算机科学家Brian W.Kernighan之手,它被昵称为“K&R C”。是它首先引入了“Hello World!”程序,这个程序几乎成了后来任何一本入门性程序设计语言书籍中的第一个例子。

        如同C语言本身简洁紧凑而极具威力一样,这本书轻薄短小而极富张力。通过简洁的描述和典型的示例,它全面、系统、准确地讲述了C语言的各个特性以及C程序设计的基

       æ³•ï¼Œå†…容涵盖基本概念、类型和表达式、控制流、函数与程序结构、指针与数组、结构、输入与输出、UNIX系统接口以及标准库等内容。

        简洁清晰是这本书最大的特色。这本小书可以教给你许多比它厚几倍的“大部头”的知识。我认为那些动辄洋洋洒洒拼凑出好几百页乃至上千页的技术作者应该好好向K&R学一学。对于中、高级程序员而言,如果希望迅速获得C语言的严肃知识而又不愿意多花费哪怕一丁点时间,这本书就是首选。

        顺便说一句,这本书的索引制作非常出色,极具实用价值,这可能首先要归功于正文部分的简明扼要。此外,尽管它看上去很像一本教程,但其实更是一本写给专业程序员的指南。如果你不具备任何其他语言程序设计背景或基本的C语言知识,这本书也许并不适合用作你的C语言启蒙读物。

        2. Perter Van Der LinDen,《C专家编程》

        C专家编程

        C语言是严肃的程序员语言,但这并不意味着C语言书籍必须板着面孔说教。在这本被C程序员昵称为“鱼书”(封面上有一条“丑陋的”腔棘鱼)的著作中,作为SUN公司编译器和操作系统核心开发组成员之一,Peter淋漓尽致地展示了其深厚的技术沉淀、丰富的项目经验、高超的写作技巧以及招牌式的幽默。在这部作品中,作者以流畅的文字、诙谐的笔法将逸闻典故、智慧和幽默自然地融入技术描述中,读来宛若一本小说,极富趣味。 本书讲述了C语言的历史、语言特性、声明、数组、指针、连接、运行时以及内存使用等知识,揭示了C语言中许多隐晦之处,尤其深入解析了声明、数组和指针、内存使用等方面的细节。要想成为一名专家级C程序员,这些内容都是必须掌握的。和其他满是抽象例子的C语言书籍不同,这本书充满了大量的来自真实世界的C程序设计实例,它们对C程序员具有很高的参照价值。另外,每一章都以极富趣味的“轻松一下”收尾,而附录A“程序员工作面试的秘密”则是任何语言的程序员在应聘工作前增强自信的好材料。

       æˆ‘怀疑真正的C专家可能用不着看这本书 ——从内容到组织方式到行文风格都决定了这是一本轻松愉快的“从菜鸟到高手”的进阶读本,所以,它理应拥有更广泛的读者群。初级程序员往往更需要热情的鼓励,在阅读这本书的过程中,你定会深深地被作者对编程的激情所感染。

        世间并无完美。我认为这本书的缺陷在于,和大多数平庸的C语言书籍一样,它画蛇添足地加入了一章关于C++的描述。在今天看来,这个描述既不全面也有失公允。不过,鉴于作者是在年从一名C程序员的角度去观察C++,这一点也就不足为奇了。 3. Samuel P. Harbison, Guy L. Steele,《C语言参考手册(第五版)》

        影印版(机械工业出版社)、中文版(机械工业出版社)

        在C语言参考手册类书籍里,Samuel P. Harbison 和Guy L. Steele合著的C: A Reference Manual是非常出色的一本。这本手册的第五版新增了对C标准的介绍,以便满足新时期C语言学习的需要。全书共分为两大部分,第一部分专注于C语言特性,第二部分则全面讨论了C标准库。本书涵盖C、C、传统的C、所有版本的C运行库以及编写与C++兼容的C代码等一切知识。

        这本手册只是中等厚度,但它比“比它更厚”的其他参考手册更清晰地描述了C语言的现在和过去的方方面面。整本手册技术细节描述精确,组织条理清楚,内容完备详尽而又简明扼要。可以这么说,它在广度、深度和精度方面都是出类拔萃的。对于中、高级C程序员而言,这本手册值得常备案头,它几乎肯定要比K&R的著作使用频率更高。

        4. David Hanson,《C语言接口与实现:创建可重用软件的技术》,机械工业出版社

        C语言接口与实现:创建可重用软件的技术

        C语言能够历经三十多年而不衰,一个重要的原因在于它的适应能力。在这“复用”、“面向对象”、“组件”、“异常处理”等先进机制漫天飞舞的年代,C语言仍然能够凭借它小而优雅的语言特性,在相当程度上满足现代软件体系架构提出的要求。只不过,想要达到这个程度,必须要在C的应用功力上达到最高层次。在嵌入式、系统软件以及对性能要求极高的系统开发中,开发人员必须达到这样的层次,熟练掌握C语言的高级特性,才能够同时满足效率和灵活性、复用性的要求。可惜,虽然C语言技术图书汗牛充栋,但是关注这个峰顶之域的作品却是屈指可数。David Hanson的C Interfaces and Implementations就是个中翘楚。

        David Hanson是业内大名鼎鼎的自由编译器lcc的合作者。在这个项目中,他负责提供高度可复用的基础架构。在不断的实践中,他完全使用ANSI C形成了一整套可复用组件库。这套组件库架构清晰,性能优异,而且提供了很多高级的特性,比如类Win SEH的异常处理机制、可移植的线程库、高性能的内存池、丰富的可复用数据结构组件。David Hanson把他在创作这些组件的过程中所积累的心得以及对其源码的精致剖析原原本本地写在了这本书里。这样的著作,当然堪称C语言领域里的铭心绝品。难怪已故著名技术作家Richard Stevens对此书赞不绝口,他说:“这本书中的技术,对于大部分C程序员来说,已经遗忘得太久了。”对于希望能在C语言应用上达到最高层次的核心程序员而言,这本书是难得的必读之作。

        其他除了以上四本书以外,我还乐意推荐Andrew Koenig的著作《C陷阱和缺陷》(人民邮电出版社)和Deitel父子合著的C How to Program两本书。

       C专家编程

        Andrew Koenig是世界上屈指可数的C++专家,他的这本书可能是最薄的一本C语言经典。它简明扼要地讲述了C程序设计中的陷阱和缺陷,包括词法陷阱、语法陷阱、语义陷阱、连接、库函数、预处理器以及可移植性缺陷等,最后一章还给出了关于如何减少程序错误的建议以及前面各章问题的参考答案。尽管这个小册子成书于C标准制定之前,然而,即使到了C早已颁布的今天,书中提到的大多数陷阱和缺陷一如十五年前那样使我们警醒。

        C程序设计教程

        Deitel父子合著的C How to Program一直是非常好的C语言入门教程,我手头的中译本名为《C程序设计教程》(机械工业出版社出版,原书第二版)。除了对技术的正规描述(辅以许多简明扼要的例子)外,每一章后面都带有小结、术语、常见的程序设计错误、良好的程序设计习惯、性能忠告、可移植性忠告、软件工程评述、自我测验练习及答案等。整书内容清晰,组织良好,易于阅读和理解。值得一提的是,有许多入门书读完一遍即可扔掉,而这一本是个例外。

        结语以上这几本书很大程度上局限于描述C语言及标准库本身,如果希望学习更专业的、领域相关的C程序设计技术,你可以在选择阅读这几本书的基础上继续查阅专门书籍。此外,在C语言书籍领域,水平不相上下的作品有很多,这几本只是根据我自身的阅读体验

7个源代码/库搜索引擎网站

       1. GitHub - 开源代码领域的领航者

       GitHub, 作为全球领先的开源代码库和版本控制系统,最近引入了革新性的源代码搜索服务。尽管它在这个领域相对较新,但其庞大的代码库已积累超过亿计,正如一篇博文中所述:“GitHub,无疑是海量宝藏的代名词!”

       2. Krugle - 互联网上的搜索巨擘

       Krugle凭借超过亿行代码的搜索覆盖,堪称全球最大的源代码搜索引擎之一,甚至声称其搜索结果囊括了全球三分之一开发者的作品。企业级服务更是覆盖了Amazon、IBM等知名企业,如Collab.net和SourceForge,以及Yahoo!等巨头。

       3. Koders - Ruby程序员的最爱

       Koders的搜索范围超过亿行代码,尤其受到Ruby程序员的热烈追捧。在被Black Duck Software收购后,Ruby搜索量激增倍,超越PHP、Perl和Python,成为该平台的第四大热门语言,仅次于Java、C/C++和C#。

       4. Codaes - Linux时代的C/C++聚焦者

       Codaes在源代码搜索领域虽然规模较小,拥有约2.5亿代码资源,但主要聚焦Linux C/C++项目,对于如今的技术环境稍显过时。除非Linux相关,否则可能有更多选择。

       5. DZone - 用户共享的贵州捉鸡源码代码宝库

       DZone拥有超过名用户贡献的个代码片段,是寻找代码的宝藏库,但需耐心挖掘。这里隐藏着无数珍贵的编程灵感,适合有毅力的探索者。

       6. Snipplr - 精致片段的海洋

       尽管Snipplr的用户数略逊于DZone(约人),但代码片段数量却高达,增长迅速。它还提供了针对Textmate、Gedit、WordPress等工具的便捷插件,效率极高。

       7. Google Code Search - 搜索领域的无可争议王者

       最后,不能不提Google Code Search,作为搜索领域的巨头,其功能强大无需赘言。虽然Google并未透露具体代码库规模,但其与GitHub、SourceForge等海量公共代码库的紧密合作,足以证明其在源代码搜索领域的主导地位。几乎涵盖了所有编程语言的支持,是开发者寻找代码的首选工具。

九款好看的后台管理系统登录模板

       欢迎观赏九款精心设计的后台管理系统登录模板,它们不仅美观,而且实用,适合直接融入项目中。欲获取源代码,可加入下方指定群组,免费领取。

       亲测可用,无任何广告干扰。

       1. HTML5全屏下雪背景动画登录注册页面模板

       2. 精致的登录注册忘记密码切换界面模板

       3. 蓝色大气养殖企业内部管理系统后台登录页面模板

       4. 基于Layui蓝色全屏粒子线条动画背景后台登录界面模板

       5. 蓝色大气app软件后台管理员登录页面模板

       6. 蓝色大气移动推广平台登录界面模板

       7. HTML5炫酷线条背景动画后台登录界面模板

       8. HTML5全屏酷炫星空闪烁背景动画后台登录界面模板

       9. 简洁好看的网站后台登录界面静态模板

       欲获取上述源代码,请加入指定群组,下载地址在群公告。

短视频直播源码,EditText输入框的使用

       短视频直播源码,EditText输入框的使用

       在开发过程中,EditText是一个重要的控件,作为View的子类,它继承了View的属性和方法。为了满足不同的unet源码怎么打开需求,Android提供了一个改进版本的AppCompatEditText,其外观更精致,而功能和用法与EditText相同。

       在创建Xml界面时,通过Android:,tools:,自定义属性等方式,可以灵活定义EditText的各种属性。例如宽度、高度、行数、输入限制等,这些常见属性有助于实现界面的精细化设计。

       为了提升用户体验和交互效果,我们需要对EditText进行状态监听。如登录功能中的错误提示、聚焦时的视觉变化等,这些通过特定的方法实现。关键的方法包括:

       内容编辑监听:实现实时反馈,如内容为空或格式不正确时,系统提示或禁用登录按钮。

       聚焦状态监听:选中时改变背景色,处理文本内容显示等。

       软键盘自动呼起:在界面加载时,聚焦EditText,自动弹出软键盘,方便用户输入。

       通过以上介绍,我们对短视频直播源码中EditText的使用有了基本的了解。更多深入内容和实践技巧,请期待后续文章的分享。

如何评价 Nix ?

探索Nix:灵活且强大的软件管理解决方案

       Nix,这一独特的软件管理工具,以其基于Nix语言的创新理念,彻底解决了传统软件依赖管理的痛点。每个软件在Nix的世界里都化身为了一个精致的表达式,包含详尽的依赖、源代码和build script,通过SHA哈希标记精确到每一个版本。这个革命性的编译结果存储区store>,确保了所有依赖的严格管理,就像一座井井有条的仓库,每个软件都在其特定的位置,互不干扰。

       Nixpkgs,Nix的官方软件库,以其高度模块化的特性,如丝般流畅。通过继承和override功能,用户可以灵活地定制和替换软件的依赖版本,就像定制一辆豪华跑车的内饰一样精细。nix-shell则像是一个魔术师的工具,它能自动生成一个隔离的开发环境,一键部署,无需你亲自动手,为开发工作带来前所未有的便利。

       Nix提供的依赖管理功能,类似于APT,但更为全面。它能够确保包括"native"库在内的所有依赖都能得到精确控制,从而提升整个系统的稳定性,就像给建筑打上了坚固的基础。nix-env则是用户环境配置的大师,它通过软链接将软件精确地安置在指定目录,同时调整PATH环境变量,使得软件的调用变得轻而易举。

       NixOS,Nix的系统级应用,作为基于Nix构建的发行版,不仅负责系统配置,还能生成虚拟机或容器,为开发者提供了无缝的环境一致性。Nix的优势在于其灵活性和统一的配置格式,然而,它并非完美无瑕。空间占用大、对二进制程序支持有限、文档不够详尽和社区规模相对较小,这些挑战正逐步被国内镜像站的可用性、文档更新以及新软件包库的涌现所弥补。

       尽管存在这些问题,但NixOS仍值得一试,特别是对于那些寻求高效配置和稳定性的用户。随着国内支持的加强和社区的活跃,Nix正逐渐成为一种值得信赖的软件管理选择。如果你是一位Linux用户,那么尝试搭建Nix开发环境,解决软件安装的繁琐,或者将其集成到CI构建中,你会发现Nix带来的效率提升是实实在在的。

       截止年3月日,Nix环境的完善程度显著提升,国内用户现在可以方便地使用镜像站,文档也得到了充实。尽管我尚未亲身体验Nix发布服务器软件或容器的功能,但相信随着社区的不断进步,这部分将会有更多的实践经验可供参考。现在是时候迈出探索Nix的第一步,看看它如何改变你的软件管理世界了。

Lua5.4 源码剖析——虚拟机2 之 闭包与UpValue

       故事将由我们拥有了一段 Lua 代码开始,我们先用 Lua 语言写一段简单的打印一加一计算结果的 Lua 代码,并把代码保存在 luatest.lua 文件中:

       可执行的一个 Lua 文件或者一份单独的文本形式 Lua 代码,在 Lua 源码中叫做 "Chunk"。无论我们通过什么形式去执行,或者用什么编辑器去执行,最终为了先载入这段 Lua 的 Chunk 到内存中,无外乎会归结到以下两种方式:1)Lua 文件的载入:require 函数 或 loadfile 函数;2)Lua 文本代码块的载入:load 函数;这两种方式最终都会来到下面源码《lparse.c》luaY_parser 函数。该函数是解析器的入口函数,负责完成代码解析工作,最终会创建并返回一个 Lua 闭包(LClosure),见下图的红框部分:

       另外,上图中间有一行代码最终会调用到 statement 函数,statement 函数是 Chunk 解析的核心函数,它会一个一个字符地处理我们编写的 Lua 代码,完成词法分析和语法分析工作,想要了解字符处理整个状态流程的可以自行研读该部分源码,见源码《lparse.c》statement 函数部分代码:

       完成了解析工作之后,luaY_parser 函数会把解析的所有成果放到 Lua 闭包(LClosure)对象之中,这些存储的内容能保证后续执行器能正常执行 Lua 闭包对应的代码。

       Lua 闭包由 Proto(也叫函数原型)与 UpValue(也叫上值)构成,见源码《lobject.h》LClosure 定义,我们下面将进行详细的讲解:

       UpValue 是 Lua 闭包数据相关的,在 Lua 的函数调用中,根据数据的作用范围可以把数据分为两种类型:1)内部数据:函数内部自己定义的数据,或者通过函数参数的形式传入的数据(在 Lua 中通过参数传入的数据本质上也是先赋值给一个局部变量);2)外部数据:在函数的更外层进行定义,脱离了该函数后仍然有效的数据;外部数据在我们的 Lua 闭包中就是 UpValue,也叫上值。

       既然 Lua 支持函数嵌套,也知道了 UpValue 本质就是上层函数的内部数据。那么 UpValue 有必要存储于 Lua 闭包(LClosure)结构体当中吗?是为了性能考虑而做的一层指针引用缓存吗?回答:并不是基于性能的考虑,因为在实际的 Lua 运用场景中,函数嵌套的层数通常来说不会太多,个别函数多一层的查询访问判断不会带来过多的性能开销。需要在闭包当中存储 UpValue 主要原因是因为内存。Lua 作为一门精致小巧的脚本语言,设计初衷不希望占用过多的系统内存,它会尽量及时地清理内存中用不到的对象。在嵌套函数中,内层函数如果仍然有被引用处于有效状态,而外层函数已经没有被引用了已经无效了,此时 Lua 支持在保留内层函数的情况下,对外层函数进行清除,从而可以清理掉外层函数引用的非当前函数 UpValue 用途以外的大量数据内存。

       尽管外层函数被清除了,Lua 仍然可以保持内层函数用到的 UpValue 值的有效性。UpValue 如何能继续保持有效,我们在之前的基础教程《基本数据类型 之 Function》里面学习过,主要是因为 UpValue 有 open 与 close 两种状态,当外层函数被清除的时候,UpValue 会有一个由 open 状态切换到 close 状态的过程,会对数据进行一定的处理,感兴趣的同学可以回到前面复习一下。

       UpValue 有效性例子

       接下来我们举一个代码例子与一个图例,表现一下 UpValue 在退出外层函数后仍然生效的情况,看一下可以做什么样的功能需求,加深一下印象,请看代码与注释:

       上述代码在执行 OutFunc 函数后,外层的 globalFunc 函数变量完成了赋值,每次对它进行调用,都将可以对它引用的 UpValue 值即 outUpValue 变量进行正常加 1。

       函数的内部数据属于函数自身的内容,外部其它函数无法通过直接的方式访问其它函数的内部数据。函数自身的东西会存在于 LClosure 结构体的 Proto*p 字段中。Proto 全称 "Function Prototypes",通常也可以叫做 "函数原型",我们来看一下它的定义,见源码《lobject.h》Proto 结构体:

       结构体字段比较多,我们先不细看,后面用到哪个字段会再进行补充说明。函数的内部数据分为常量与变量(即函数局部变量),分别对应上图的如下字段:

       1)常量:TValue* k 为指针指向常量数组;int sizek 为函数内部定义的常量个数,也即常量数组 k 的元素个数。

       2)局部变量:LocVar* locvars 为指针指向局部变量数组;int sizelocvars 为函数定义的局部变量个数,也即局部变量数组 locvars 的元素个数。

       UpValue 的描述信息会存储在 Proto 结构体中的 Upvaldesc* upvalues 字段,解析器解析 Lua 代码的时候会生成这个 UpValue 描述信息,并用于生成指令,而执行器运行的时候可以通过该描述信息方便快速地构建出真正的 UpValue 数组。

       至此,我们知道了函数拥有 UpValue,有常量,有局部变量。外部数据 UpValue 也讲完,内部数据也讲完。接下来,我们开始学习函数运行的逻辑指令相关内容。

       函数逻辑指令存储于函数原型 Proto 结构体中,这些函数逻辑是由一行行的 Lua 代码构成的,代码会被解析器翻译成 Lua 虚拟机能识别的指令,我们把这些指令称为 "OpCode",也叫 "操作码"。Proto 结构体存储 OpCode 使用的是下图中红框部分字段,见源码《lobject.h》Proto 结构体:

       至此,我们可以简单提前说一下 Lua 虚拟机的功能了,本质上来看,Lua 虚拟机的工作,就是为当前函数(或者当前一段 OpCode 数组)准备好数据,然后有序执行 OpCode 指令。

       对 OpCode 有了一定的认识了,接下来我们要补充一个 OpCode 相关的 Lua 闭包相关的内容,就是 Lua 闭包的运行环境。

       一个 Lua 文件在载入的时候会先创建出一个最顶层(Top level)的 Lua 闭包,该闭包默认带有一个 UpValue,这个 UpValue 的变量名为 "_ENV",它指向 Lua 虚拟机的全局变量表,即_G 表,可以理解为_G 表即为当前 Lua 文件中代码的运行环境 (env)。事实上,每一个 Lua 闭包它们第一个 UpValue 值都是_ENV。

       ENV 的定义在我们之前提到的解析器相关函数 mainfunc 中,见源码《lparser.c》:

       如果想要设置这个载入后的初始运行环境不使用默认的 _G 表,除了直接在该文件代码中重新赋值_ENV 变量这种粗暴且不推荐的方式以外,通常是通过我们前面提到的加载 Lua 文件函数或加载 Lua 字符串代码函数传入 env 参数(Table 类型),就可以用自定义的 Table 作为当前 Lua 闭包的全局变量环境了,env 参数为上面两个函数的最末尾一个参数,'[' 与 ']' 字符中的内容表示参数可选,函数的定义摘自 Lua5.4 官网文档:

       所以我们可以在 Lua 代码通过 _ENV 访问当前环境:

       在 Lua 的旧版本中,变量的查询最多会分为 3 步:1)先从函数局部变量中进行查找;2)找不到的话就从 UpValue 中查找;3)还找不到就从全局环境默认 _G 表查找。而在 Lua5.4 中,把 UpValue 与全局 _G 表的查询统一为 UpValue 查询,并把一些操作判断提前到了解析器解析阶段进行,例如函数内部使用的某个 UpVaue 变量在代码解析的时候就可以通过 UpValue 描述信息知道存储于 Lua 闭包 upvals 数组的哪个下标位置,在执行器运行的时候只需要直接在数组拿取对应下标的这个 UpValue 数据即可。

       从 OpCode 的层面来看,Lua 除了支持通过一个 UpValue 数组下标访问一个 UpValue 变量,在把 _G 表合并到 UpValue 之后,Lua 为此实现了通过一个字符串 key 值从某个 Table 类型的 UpValue 中查询变量的操作。

       至此,我们了解了 Lua 闭包的结构与运行环境,以及 OpCode 的基本概念。接下来,我们将深入学习 OpCode,掌握 OpCode 就掌握了整个 Lua 虚拟机数据与逻辑的流向。