写上变量的地方意味着当以其保存的值来替代之。 Lua 中有三类变量:全局变量,局部变量,还有 table 的域。
一个单一的名字可以表示一个全局变量,也可以表示一个局部变量 (或者是一个函数的参数,这是一种特殊形式的局部变量):
var ::= Name
Name 就是 §2.1 中所定义的标识符。
任何变量都被假定为全局变量,除非显式的以 local 修饰定义 (参见 §2.4.7)。 局部变量有其作用范围: 局部变量可以被定义在它作用范围中的函数自由使用 (参见 §2.6)。
在变量的首次赋值之前,变量的值均为 nil。
方括号被用来对 table 作索引:
var ::= prefixexp `[´ exp `]´
对全局变量以及 table 域之访问的含义可以通过 metatable 来改变。
以取一个变量下标指向的量 t[i]
等价于调用 gettable_event(t,i)
。
(参见 §2.8 ,有一份完整的关于
gettable_event
函数的说明。
这个函数并没有在 lua 中定义出来,也不能在 lua 中调用。
这里我们把它列出来只是方便说明。)
var.Name
这种语法只是一个语法糖,用来表示
var["Name"]
:
var ::= prefixexp `.´ Name
所有的全局变量都是放在一个特定 lua table 的诸个域中,这个特定的 table
叫作 environment (环境)table 或者简称为
环境 (参见 §2.9)。
每个函数都有对一个环境的引用,
所以一个函数中可见的所有全局变量都放在这个函数所引用的环境表(environment table)中。
当一个函数被创建出来,它会从创建它的函数中继承其环境,你可以调用
getfenv
取得其环境。
如果想改变环境,可以调用 setfenv
。
(对于 C 函数,你只能通过 debug 库来改变其环境;
参见 §5.9)。
对一个全局变量 x
的访问
等价于 _env.x
,而这又可以等价于
gettable_event(_env, "x")
这里,_env
是当前运行的函数的环境。
(函数 gettable_event
的完整说明参见 §2.8。
这个函数并没有在 lua 中定义出来,也不能调用。
当然,_env
这个变量也同样没有在 Lua 中定义出来。
我们在这里使用它们,仅仅只是方便解释而已。)