Lua 变量

  变量在使用前,需要在代码中进行声明,即创建该变量。

  变量需要标识类型是因为编译程序执行代码之前需要知道如何给语句变量开辟存储区,用于存储变量的值。

  Lua变量有三种类型:全局变量、局部变量、表中的域。

  Lua 中的变量全是全局变量,哪怕是在语句块或是函数里,除非使用local关键字显式声明为局部变量。

  局部变量的作用域为从声明位置开始到所在语句块结束。

变量的默认值均为nil。

赋值语句

  Lua遇到赋值语句会先计算出右边所有的值然后再执行赋值操作,所以我们可以这样进行交换变量的值:

x, y = y, x                     -- swap 'x' for 'y',比如原本x = 1,y = 2,那么先计算右侧的值,则x,y = 2,1,然后在进行赋值操作,则x = 2,y = 1
a[i], a[j] = a[j], a[i]         -- swap 'a[i]' for 'a[j]',同上。

  当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下措施:

-- 变量个数 > 值的个数             先从左至右赋值,剩下的变量默认补足为nil
-- 变量个数 < 值的个数             先从左至右赋值,多余的值会被忽略
a, b, c = 0, 1
print(a,b,c)             --> 0   1   nil
 
a, b = a+1, b+1, b+2     -- value of b+2 is ignored
print(a,b)               --> 1   2
 
a, b, c = 0
print(a,b,c)             --> 0   nil   nil

注意:如果要对多个变量赋值必须依次对每个变量赋值。

a, b, c = 0, 0, 0
print(a,b,c)             --> 0   0   0

  多值赋值经常用来交换变量或将函数调用返回给变量:

a, b = f()

  f()返回两个值,第一个赋给a,第二个赋给b。

  应该尽可能的使用局部变量,有两个好处:

  1. 避免命名冲突。
  2. 访问局部变量的速度比全局变量更快。

注意点

  Lua 对多个变量同时赋值,不会进行变量传递,仅做值传递。

a, b = 0, 1
a, b = a+1, a+1
print(a,b)               --> 1   1
a, b = 0, 1
a, b = b+1, b+1
print(a,b)               --> 2   2
a, b = 0, 1
a = a+1
b = a+1
print(a,b)               --> 1   2

这也印证Lua是先计算右侧的值,再进行赋值操作的。

全局变量

  在Lua 语言中,全局变量无须声明即可使用,使用未经初始化的全局变量不会导致错误。当使用未经初始化的全局变量时,得到的结果为 nil

b        --> nil
b = 10    
b        --> 10

当把nil赋值给全局变量时,Lua会回收该全局变量,例如:

b = nil
b        --> nil