Description
在 Lua 中,使用 do-end 将一条或多条语句包起来作为一个语句块儿(block),形成一个作用域,在这个作用域中定义的局部变量只在当前作用域有效,出了作用域之后就会被垃圾回收器自动回收!
do
local l_var = 1 -- 局部变量
g_var = 2 -- 全局变量
print(l_var, g_var) -- 1 2
end
print(l_var, g_var) -- nil 2
ps
在作用域中定义的全局变量不受作用域的影响!
Analogy
我们可以将 do-end 理解为 C# 中的 {},可以看下 Lua 和 C# 的循环语句:
Lua
for i = 1, 2, 1 do
-- code block
end
C#
for(int i = 1; i <= 2; i++)
{
// code block
}
Example
其实在日常开发中,我们主动使用 do-end 的情况并不多,但有时在测试代码的过程中,想要一个函数执行到某一处(还未执行完毕)就提前返回(相当于注释掉后面的代码),这时候就需要用到:
do return end
那么问题来了,我们直接 return 不就好了么,为嘛还要用 do-end 包一层?
那我们就不包嘛:
function test()
local x = 1
return
x = x + 1 -- 报错:'end' expected (to close 'function' at line 1) near '='
end
这不,和其他语言不一样,Lua 的语法不支持你这样写,人家规定 return 后面必须得要跟个 end 才行!
所以这样写才不会有问题:
function test()
local x = 1
do return end
x = x + 1
end