【Lua进阶系列】环境ENV__env lua_Lampard猿奋的博客-程序员秘密

技术标签: _ENV  全局环境  lua  LUA  ENV  

             【Lua进阶系列】环境ENV

   

    大家好,我是Lampard猿奋~~

    欢迎来到Lua进阶系列的博客,今天和大家分享一下lua中关于环境的一些知识

  

 (一)全局环境_G

        lua使用一个表来保存全局变量,一方面简化了Lua语言内部的实现,另一方面可以像操作一个普通表一样操作这个表。lua把全局环境本身保存到全局变量_G中(因此_G._G 和 _G是等价的),我们可以通过_G来访问/设置全局变量。

   

         Lua中的全局变量不需要声明就可以使用,虽然这种行为对于小程序来说可能会比较方便。但是对于大型项目来说可能会引起一些BUG,因为_G就是一个表结构,因此我们可以利用元表的机制来避免这种情况。

         对不存在的key赋值:

        访问不存在的key:

      那么如果我们需要声明一个新的全局变量的时候,使用rawset函数就可以了。rawset可以绕过元方法直接对表复制。

      Lua5.3参考文档对rawset的解释:

      Lua不允许值为nil的全局变量,因为值为nil的全局变量都会被自动地认为自己是未声明的。但是,要允许值为nil的全局变量也不难,只需要引入一个辅助表来保存已声明的名称即可。

 

 (二)非全局环境_ENV

         lua 5.2 正式发布了,对于 lua 语言本身的修改,重中之重就是对 environment 这个概念的修改,本质上,lua 取消了原有意义上的 environment,而是通过使用非全局变量_ENV(上值upvalue)来保存这个全局环境 。全局变量实际上只是一个语法糖,编译时再前面加上了 _ENV. 的前缀。这样,从 load 开始,第一个 chunk 就被加上了 _ENV 这个 upvalue ,然后依次传递下去。

       

        简单来说其实就是经历了这三个步骤

  1. 编译器在编译所有代码段之前,在外层创建局部变量_ENV
  2. 编译器将所有的自由名称var变换为_ENV.var
  3. 函数load使用全局环境(保存在_G)初始化代码段的第一个上值,即Lua语言内部维护的一个普通的表

       当我们声明一个"全局"变量时,其实是把这个变量声明到用全局环境初始化的上值_ENV中而已。当我们把_ENV置空之后就会丢失掉全局函数的环境。

       这么做的好处是什么呢

      在我看来,这就有点像C++中的命名空间,一方面能够保护_G这个全局环境不被污染,另一方面则是避免了同名函数发生覆盖的情况。

      如果想调用某模块的全局函数需要先引入该模块

 

      如果调用不同模块之间的同名函数,那么会调用最后require的模块函数

     最后,其实_ENV也不一定非要使用全局环境初始化,我们可以通过loadfile中的可选参数,给这个模块创立一个新的环境。这样做的好处是哪怕此时有恶意代码进入该模块,也无法访问到其他全局数据。

 

 

以上是学习路上的一点思绪,欢迎大家评论指点~

点赞,关注!!!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cooclc/article/details/115359535

智能推荐

Android自定义控件坐标系解析_龙旋的博客-程序员秘密

自定义控件要想彻底的把握,掌握Android各种坐标系及一些API的坐标含义毫无疑问是不可忽视的技能,对于控件的摆放位置、触摸点、控件绘制等都离不开坐标系,所以学习自定义控件之前我们就先来谈一下Android坐标系。一、Android屏幕坐标系和数学坐标系的区别(1)、在数学坐标系中以xy轴的交点为坐标原点,x轴向右为正方向,y轴向上为正方向,这对于童鞋们来说已经再熟悉不过了,如图:(2)、而在手机屏幕上的坐标系与数学坐标系还是有差别的,移动设备一般定义屏幕左上角为坐标原点,x轴向右为正方向,y轴向

怎么给esayUI datagrid列标题名title做修改背景色或字体的操作_weixin_30633949的博客-程序员秘密

重写下面的样式就可以了.datagrid-header,.datagrid-td-rownumber { background-color: #efefef; background: -webkit-linear-gradient(top,#F9F9F9 0,#efefef 100%); background: -moz-linear-gradient(top,#F9F9F9 0,#efef...

色彩校正中的 gamma 值是什么?_手机gamma多少合适_凌风探梅的博客-程序员秘密

色彩学色彩校正中的 gamma 值是什么?一直听到这个词就是不知道什么意思,也没找到特别好的介绍。添加评论 分享按投票排序按时间排序6 个回答131赞同反对,不会显示你的姓名韩世麟Huang Eli、知乎用户、melody 等人赞同

【黑马程序员】————数据类型总结_aa123321621的博客-程序员秘密

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------一、基本数据类型1.int1> long int、long:8个字节 %ld2> short int、short:2个字节 %d %i3> unsigned int、unsigned:4个字节 %zd 4> signed int、signed、int:...

html阅读开放试用阶段 欢迎体验,迎接HTML5 欧朋浏览器H5体验版试用手记_bob jang的博客-程序员秘密

前言:2012是HTML5年,随着2011年主流手机浏览器支持HTML5,UC、QQ、欧朋先后推出可支持HTML5页面版的浏览器,这也宣告手机HTML5时代到来。但是由于手机浏览器的内核和性能存在差异,也造成不同的HTML5浏览器的不同格局。这种格局的变化也让小编对HTML5手机浏览器产生了浓厚的兴趣,近日小编在欧朋官网看到欧朋推出主打HTML5体验版的手机浏览器——欧朋浏览器H5体验版,在体验过...

循环上下文和.CurrentMember函数_weixin_30418341的博客-程序员秘密

出了当前单元的上下文,还有但前迭代或循环的上下文。Generate()函数用来提供迭代。聚合函数(如Sum(),Max()等等)同样提供循环上下文,每迭代一次就对表达式求值一次。 例1. 考虑一下的查询,选出一组作品集,这个集计算其[Unit Sales]对其同类最大[Unit Sales]的比例。 withmember [Measures].[Pct of Max Sib...

随便推点

logistic回归模型总结_logistic c_percent_myccc456的博客-程序员秘密

logistic回归模型是最成熟也是应用最广泛的分类模型,通过学习和实践拟通过从入门、进阶到高级的过程对其进行总结,以便加深自己的理解也为对此有兴趣者提供学习的便利。一、有关logistic的基本概念  logistic回归主要用来预测离散因变量与一组解释变量之间的关系最常用的是二值型logistic。即因变量的取值只包含两个类别 例如:好、坏 ;发生、不发生;常用Y=1或

黑白照片上色软件app有哪些?这几款软件简单易上手_橙色的天空的博客-程序员秘密

此外,它的安全系数高,不会将我们上传处理的图片储存在云端,一个小时后就会将其自动删除。它其中的黑白照上色功能依托着智能检测技术,可以快速扫描照片内容,为其进行适当的色彩填充,不需要我们手动去进行调整,仅需导入照片就会自动处理,没有基础的小白也可以轻松上手。由于快过年了,我家开始进行大扫除,而在这期间我无意发现了爸爸妈妈年轻时的照片,只不过当时的科技还不够发达,拍摄出来的照片是黑白色的,所以我心里蒙生了一个想法:将这些黑白照进行上色,然后给他们一个小惊喜。分享理由:操作简单,修图小白也可以轻松上手。

PostgreSQL 统计所有数据表各自的总行数_dotNET跨平台的博客-程序员秘密

一般来说,可以使用 count(*) 来获取具体某张表的总行数:SELECT count(0) FROM t_user;如果想获得所有表的行数信息,可以使用以下 SQL 语句:SELECT...

tableView的刷新_tableview刷新_qq_16231975的博客-程序员秘密

一,刷新的总体步骤  1>修改数据模型  2>刷新表格(刷新界面)二,刷新方法  1>全局刷新- (void)reloadData; 2>局部刷新(使用前提:刷新前后,模型的个数没有改变)- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnima

Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,pas_king config的博客-程序员秘密

Ansible执行playbook出现如下问题原因:ansible是使用ssh协议去执行的命令,所以看当前用户的ssh是否正常,当前是root用户,在sshd配置文件中开启了PermitRootLogin no ,所以执行失败,修改为PermitRootLogin yes即可sed -i 's/PermitRootLogin no/PermitRootLogin yes/g' /etc/ssh/sshd_config && systemctl restart sshd...

C语言回顾学习(数组、函数、指针应用、最大最小值查找以及删除、平均值求解)_NoThing23的博客-程序员秘密

C语言回顾学习-N1学习目录介绍C语言回顾学习-N1概述具体实例实例分析功能分析各功能实现方式全局变量定义以及预编译代码数据录入功能数组元素的查询和删减和打印功能数组元素的平均值求取动态分配数组元素大小(malloc、free)代码源码以及实验结果总结概述本文主要回顾C语言中的几个基础知识,你将会看到:1.在函数体中应用指针通过改变形参同时影响到实参改变;2.在C语言中动态分配数组元素大小;3.数组元素的删除、打印、求平均值;4.查询数组中的最大最小值并且打印出来,且记录下它们的索引。我将会

推荐文章

热门文章

相关标签