Lua的实现是非常简单而且清晰的,我决定整理一下最近学到的lua知识,我想先从lua的环境开始谈起。

环境是个什么概念呢?在lua中,大部分的结构都可以用table来表达,环境也不例外,环境指的是一张表,这张表里保存这能够使用的全局变量。这样说还是不太清晰,接着看就会明白了。

全局环境是什么呢?Lua有一个大的环境,即 _G 环境。这个是全局环境,保存着全局的变量。可以通过这行代码打印出 _G 环境里的内容:for k, v in pairs(_G) do print(k, v) end,在我的电脑中,显示的结果如下(版本是lua5.1的,所以有部分值在lua5.2中已经看不到了):

下面我们一个一个来弄清楚全局环境里的这些东西从哪来。

lua源码linit.c中,在luaL_openlibs中把下面这个table中对应的内容以及模块的名称放到了 _G 环境中。

在base库里面向 _G 环境添加了23个函数和2个值,这些可以在源文件lbaselib.c里面找到:

内容如下25个值:

_G、_VERSION、assert、collectgarbage、dofile、error、getmetatable、ipairs、loadfile、load、loadstring、next、pairs、pcall、print、rawequal、rawlen(lua5.2中增加的,lua5.1中没有)、rawget、rawset、select、setmetatable、tonumber、tostring、type、xpcall

然后是9个模块的名字对应的table,在lualib.h里可以找到定义,分别是:coroutine、table、io、os、string、bit32(lua5.2中增加的,lua5.1中没有)、math、debug、package,他们在linit.c中由luaL_requiref(luaxlib.c)函数放入 _G 环境中。

还剩下8个值:unpack、arg、module、require、getfenv、setfenv、newproxy、gcinfo

unpack在加载table库(ltablib.c)时放入 _G 环境:

arg在lua脚本执行的时候(lua.c)被放入 _G 环境中:

module和require在加载package时(loadlib.c)被放入 _G 环境。

lua5.2中没有把getfenv、setfenv、newproxy、gcinfo放入全局环境中了。lua5.1中还保留这4个值。

转载于:https://blog.51cto.com/rangercyh/1107103

Lua5.2中的全局环境相关推荐

  1. Lua中的函数环境、_G及_ENV

    lua5.1中的全局环境变量 Lua将环境table保存在一个全局变量_G中,可以对其访问和设置.一般我们把需要被访问的对象和函数等放到这里, 然后我们可以在需要时通过它来访问和使用. 可以通过val ...

  2. 安装Windows Lua5.1 x86|x64 开发环境(Windows Lua LuaRocks msvc)

    安装Windows Lua5.1 x86|x64 开发环境 1. 背景 1.1 二进制版本问题 1.2 luajit的兼容性 2.兼容安装Lua5.1 x86 环境 3.编译安装Lua5.1 x64环 ...

  3. 简述SHELL全局环境变量与局变环境变量

    在Linux中,很多程序和脚本都通过环境变量来获取系统信息,存储临时数据,配置信息.环境变量是指用来存储有关shell会话和工作环境信息,允许你在内存中存储数据,以便程序或shell中运行的脚本能够轻 ...

  4. webstorm配置环境变量_webstorm中配置nodejs环境及npm步骤详细解说

    这次给大家带来webstorm中配置nodejs环境及npm步骤详解,webstorm中配置nodejs环境及npm的注意事项有哪些,下面就是实战案例,一起来看一下. --nodejs安装及环境配置 ...

  5. windows 全局变量_如何在Windows中使用全局系统环境变量

    windows 全局变量 Any system administrator who spends a good bit of time in the command prompt or batch s ...

  6. 如何在 ASP.NET Core 中实现全局异常拦截

    异常是一种运行时错误,当异常没有得到适当的处理,很可能会导致你的程序意外终止,这篇就来讨论一下如何在 ASP.Net Core MVC 中实现全局异常处理,我会用一些 样例代码 和 截图 来说明这些概 ...

  7. 获取异常信息_如何在 ASP.NET Core 中实现全局异常拦截

    异常是一种运行时错误,当异常没有得到适当的处理,很可能会导致你的程序意外终止,这篇就来讨论一下如何在 ASP.Net Core MVC 中实现全局异常处理,我会用一些 样例代码 和 截图 来说明这些概 ...

  8. npm全局环境变量配置及解决VsCode使用时遇到的问题

    一.npm全局环境变量配置 1.我们要先配置npm的全局模块的存放路径以及cache的路径 例如我希望将以上两个文件夹放在NodeJS的主目录下,便在NodeJs下建立"node_globa ...

  9. 深入理解Python中的全局解释锁GIL

    深入理解Python中的全局解释锁GIL 转自:https://zhuanlan.zhihu.com/p/75780308 注:本文为蜗牛学院资深讲师卿淳俊老师原创,首发自公众号https://mp. ...

最新文章

  1. 为什么铝基板无线接受电路板将信号源烧了?
  2. 原始尺寸_螺母尺寸检测,螺丝螺母外观检测设备
  3. 机器学习算法源码全解析(二)-范数规则化之L0、L1与L2范数
  4. 表中的数据导出为insert语句的简单方法
  5. PIT和TestNG突变测试简介
  6. mysql 出现 quot_MYSQL 新版出现 Client does_mysql _ 搞代码
  7. 【网络编程】time_wait状态产生的原因,危害,如何避免
  8. java多线程 run start_java多线程中run和start区别
  9. Linked server的一个问题
  10. python之函数(function)
  11. java 电子签章 开源_java操作pdf制作电子签章 - CSDN博客
  12. 微信自定义菜单以及自动回复
  13. linux zip分卷压缩解压命令
  14. 【学习笔记】Python_Faker,制造测试数据的第三方库,创建姓名、手机、电话、浏览器头、时间、地址等
  15. 工作流Airflow的性能优化,应对dag数目的激增
  16. r语言c函数怎么用,R语言学习笔记——C#中如何使用R语言setwd()函数
  17. 苯四乙酸 cas1820793-31-4 齐岳中间体|单体材料
  18. nagios二次开发(四)---nagios监控原理和nagios架构简介
  19. 我的世界java版怎么选择版本_《我的世界》游戏版本太多,玩家该如何选择?听听老玩家怎么说...
  20. t3提示本地系统高于服务器,登录T3软件时,提示本地版本高于服务器已升级版本...

热门文章

  1. 第二弹!谷歌大脑2017总结下篇:Jeff Dean梳理6大领域研究
  2. 尴尬……无人车美国赌城上路不到一小时就撞了
  3. 比特币交易平台软件开发:比特币和以太坊有什么区别?
  4. 11.06T1 DLZ常数剪枝+DP
  5. 大数据日志分析项目架构
  6. NoSQL数据库的分布式算法
  7. perl socket初步
  8. 聊聊Spring Data Auditable接口的变化
  9. 自动驾驶汽车也能聊天?
  10. 物联网处理器五大类型应用分析指南