一)全局-局部变量
-
全局变量是指:这个变量在没有被同名局部变量覆盖的时候,所有代码块都是可见的。
-
局部变量是指:该变量只在被申明的代码块中可见,并且可以覆盖同名全局变量或者外层局部变量。
Lua 中的局部变量要用 local 关键字来显式定义,不使用 local 显式定义的变量就是全局变量:
g_var = 1 -- 全局变量
local l_var = 2 -- 局部变量
1)局部变量作用域
局部变量的生命周期是有限的,它的作用域仅限于声明它的块(block)。
一个块是一个控制结构的执行体、或者是一个函数的执行体再或者是一个程序块(chunk)。
我们可以通过下面这个例子来理解一下局部变量作用域的问题:
x = 10 -- 全局变量
local i = 1 -- 程序块中的局部变量 i
while i <=x do -- 判断条件的x为全局变量的x
local x = i * 2 -- while 循环体中的局部变量 x
print(x) -- output: 2, 4, 6, 8, ...
i = i + 1
end
print("while循环结束");
if i > 20 then
local x -- then 中的局部变量 x
x = 20
print(x + 2) -- 如果i > 20 将会打印 22,此处的 x 是局部变量
else
print(x) -- 打印 10,这里 x 是全局变量
end
print(x) -- 打印 10
2)使用局部变量的好处
局部变量可以避免因为命名问题污染了全局环境
local 变量的访问比全局变量更快
由于局部变量出了作用域之后生命周期结束,这样可以被垃圾回收器及时释放
在生产环境中,我们应该尽可能用 局部变量。
3)全局变量,其实本质上也是一个table,它把我们创建的全局变量都保存到一个table里了。
而这个table的名字是:_G
-- 定义一个全局变量
gName = "我是个全局变量";
-- 用三种方式输出变量的值
print(gName);
print(_G["gName"]);
print(_G.gName);
二)虚变量
当一个方法返回多个值时,有些返回值有时候用不到,要是声明很多变量来一一接收,显然不太合适(不是不能)。
Lua 提供了一个虚变量,以单个下划线(“_”)来命名,用它来丢弃不需要的数值,仅仅起到占位的作用。
local start, finish = string.find("hello", "he") --start 值为起始下标,finish
--值为结束下标
print ( start, finish ) --输出 1 2
local start = string.find("hello", "he") -- start值为起始下标
print ( start ) -- 输出 1
local _,finish = string.find("hello", "he") --采用虚变量(即下划线),接收起
--始下标值,然后丢弃,finish接收
--结束下标值
print ( finish ) --输出 2
代码倒数第二行,定义了一个用 local 修饰的 虚变量(即 单个下划线)。使用这个虚变量接收 string.find() 第一个返回值,静默丢掉,这样就直接得到第二个返回值了。
虚变量不仅仅可以被用在返回值,还可以用在迭代等。
local t = {1, 3, 5}
print("all data:")
for i,v in ipairs(t) do
print(i,v)
end
print("")
print("part data:")
for _,v in ipairs(t) do
print(v)
end
执行结果:
# luajit test.lua
all data:
1 1
2 3
3 5
part data:
1
3
5