Lua语言中的变量在默认情况下是全局变量,这和我们熟悉的C、C++等语言默认情况下是局部变量不同。Lua中所有的局部变量必须用local关键字来声明,局部变量的生效范围仅在声明它的代码块中。
当需要控制局部变量的生效范围是可以使用do...end程序块。尽可能的使用局部变量是一种良好的编程风格。首先,局部变量可以避免由于不必要命名而造成全局变量的混乱;其次,局部变量可以避免同一程序中不同代码部分的命名冲突;最后,也是我个人认为很重要的一点就是,局部变量会随着作用域的结束而消失,从而使得垃圾收集器(GC)能够将其释放。
控制结构
Lua语言提供的常用的控制结构有if, while, repeat 和 for.所用的控制结构语法上必须有一个显示的终结符: end.
if,while 和 repeat 在其他编程语言中都有接触过,重点记录一下Lua的for循环结构。Lua的for循环结构主要分为两种,一种是数值型for, 这种循环和我们常见的for循环基本一致, 另一种for循环结构是泛型for. 泛型for遍历迭代函数所有的返回值。
Break,return 和 goto
break语句和return语句用于从当前的循环结构中跳出,goto语句则允许跳转到函数中的标签处执行。
Lua语言在使用goto时设置了一些限制条件。首先,标签遵循常见的可见性规则,即只能在当前代码块或者父代码块中可见,因此不能直接跳转到另一个代码块中的标签。其次,goto函数不能跳转到函数外。最后,goto不能跳转到局部变量的作用域。
goto语句虽然备受争议,但是它在编写状态机时其实还是很有用的。
::s1:: do
local c = io.read(1)
if c == '0' then goto s2
elseif c == nil then print 'ok'; return
else goto s1
end
end
::s2:: do
local c = io.read(1)
if c == '0' then goto s1
elseif c == nil then print 'not ok'; return
else goto s2
end
end
goto s1