关于“环境”的一大问题在于它是全局的,任何对它的修改都会影响程序的所有部分。

例如:若安装一个元表用于控制全局变量的访问,那么整个程序都必须遵循这个规范。

当使用某个库时,没有先声明就使用了全局变量,那么这个程序就无法运行。

  在Lua中,全局变量并不需要一定是全局的。甚至可以说Lua没有全局变量。

听上去感觉很奇怪,因为我们一直都在使用全局变量。毫无疑问地,Lua一直在给程序员制造全局变量的错觉。

下面看看是怎么样制造的:

比如在下面的例子中,var1和var2 就是两个自由名字(在任何层都没有被声明的名字):

var1 = var2 + 

就像之前我们说的,一个自由名字不会涉及到一个全局变量,至少不会显示地涉及到。

对于_ENV,手册上是这样描述:

Every chunk is compiled in the scope of an external local variable named _ENV , so _ENV itself is never a free name in a chunk.

这里的“external local variable”就是upvalue,也就是_ENV是当前chunk的upvalue。

当Lua编译一个chunk的时候,如果不指定的话,默认使用全局环境初始化它的upvalue _ENV(其实就是引用),它是隐式声明的一个upvalue。

此外,在句法上,Lua解释器会把所有的自由名字 var 翻译为_ENV.var。因此上面的代码可以这样表示:

_ENV.var1  = _ENV.var2 + 

Lua将所有的代码块当作匿名函数。Lua编译器在编译代码块的时候是这样的:

local _ENV = <some value>
return function(...)
_ENV.var1 = _ENV.var2 +
end

看上去,这样去操作全局变量挺费解的。但是其实是最简单灵活的方式,但是实现起来有点困难。

总结一下在Lua5.2中操作全局变量的情况:

1>_ENV是当前被编译代码块的upvalue

2>Lua编译器把所有的free name var 当作 _ENV.var

3>load 或loadfile函数 用全局环境去初始化代码块中的第一个upvalue。

_ENV除了在预编译的时候才有特殊意义。跳出编译去看它,其实就是一个简单的普通表。

同样把var 当作 _ENV.var,也只是词法翻译,没有隐含的意思。

这节有点没有懂,以后回来再好好看看。

以上内容来自:《Lua程序设计第二版》和《Programming in Lua  third edition》

最新文章

  1. python遍历一个网段的ip地址
  2. poll函数
  3. SGU 410 Galaxy in danger --贪心,想法题
  4. 表单美化-原生javascript和jQuery单选按钮(兼容IE6)
  5. ASP.NET MVC 缓存使用示例
  6. 在Unity中使用Shader
  7. [KMP求最小循环节][HDU1358][Period]
  8. c friend -- 友元
  9. PS多形式的部分之间复制“笨办法”
  10. 前端CSS的工程化——掌握Sass这四大特性就够了
  11. list类型
  12. html 标签内联元素和块元素分类【转】
  13. 【原创】java socket 和.net socket 通讯 demo
  14. 变量计算——强制类型转换的js面试题
  15. jmeter的环境配置
  16. ActiveMQ延迟消息配置
  17. 神奇的照片修复术,这才是 PS 的正确打开方式!
  18. [na]诺顿ghost磁盘对刻(备份系统分区或数据分区)
  19. C++11线程使用总结
  20. 双缓冲解决控制台应用程序输出“闪屏”(C/C++,Windows)

热门文章

  1. 5754Life Winner Bo
  2. ngDialog 设置其宽度大小
  3. IOS 基于TCP的socket通信详解(原创)
  4. spring 加载多个资源文件
  5. action 耦合方式
  6. HDU 1517 A Multiplication Game 博弈
  7. Redis链表相关操作命令
  8. Fighting For 2017 Season Contest 1
  9. 一些常见的CFD基本概念(飞机为例)(摘抄)
  10. zkw费用流