全局变量

创建一个全局变量

全局变量不需要声明,给一个变量赋值即创建了一个全局变量,访问一个没有初始化的变量(默认是全局变量,即,lua的变量默认是全局变量,特别注意)也不会出错,会返回nil

1
2
3
print(var_a) 
var_a = 10
print(var_a) -- 10

在命令模式中执行如下:

1
2
3
4
Lua 5.3.4  Copyright (C) 1994-2017 Lua.org, PUC-Rio
print(var_a)
nil

删除一个全局变量

删除一个变量很简单,直接将改变量赋值为nil;如下面的例子:b是全局变量,当赋值为nil之后,再调用print就会返回nil

1
2
3
4
5
Lua 5.3.4  Copyright (C) 1994-2017 Lua.org, PUC-Rio
b = 1; print("b=" .. b); b = nil; print(b);
b=1
nil

总之,可以这么理解:当一个变量被赋值为nil,这个变量就变得像从来没出现过一样,换句话说,只有当一个变量的值不是nil这个变量才是存在的

局部变量

使用local 关键字来声明一个局部变量,和其他语言一样,局部变量只在被声明的那个代码块中有效。代码块包括:

  1. 控制结构
  2. 函数体
  3. chunk(变量被声明的那个文件或者文本串

注意:命令行模式中每一行就是一个chunk,也就是说,上一行的局部变量下一行就不可见了。

1
2
3
4
5
6
7
8
Lua 5.3.4  Copyright (C) 1994-2017 Lua.org, PUC-Rio
a = 1 -- 全局变量
> print(a)
1
> local b = 2 -- 局部变量
> print(b)
nil
>

使用do ... end

使用do ... end可以给一个block一个明确的边界。

1
2
3
4
5
6
7
8
9
10
11
12
13
Lua 5.3.4  Copyright (C) 1994-2017 Lua.org, PUC-Rio
> a = 1 --全局变量
> local b = 2 -- 局部变量
> do
>> local c = a * 3 --局部变量
>> print(a)
>> print(b)
>> print(c)
>> end
1
nil
3
>