Lua 文件 I/O | 菜鸟教程 (runoob.com)
暂留
Lua语言中的变量在默认情况下是全局变量,所有的局部变量在使用前必须声明
在交互模式中,每一行代码就是一个代码段(除非不是一条完整的命令)。一旦输入示例的第二行(local i=1),Lua语言解释器就会直接运行它并在下一行开始一个新的代码段。这样,局部(local)的声明就超出了原来的作用范围。解决这个问题的一种方式是显式地声明整个代码块,即将它放入一对do–end中。一旦输入了do,命令就只会在遇到匹配的end时才结束,这样Lua语言解释器就不会单独执行每一行的命令
好处:局部变量可以避免由于不必要的命名而造成全局变量的混乱;其次,局部变量还能避免同一程序中不同代码部分中的命名冲突;再次,访问局部变量比访问全局变量更快;最后,局部变量会随着其作用域的结束而消失,从而使得垃圾收集器能够将其释放。
如果一个声明中没有赋初值,则变量会被初始化为nil
Lua语言中的一种常见用法:
这段代码声明了一个局部变量foo,然后用全局变量foo对其赋初值(局部变量foo只有在声明之后才能被访问)。这个用法在需要提高对foo的访问速度时很有用。当其他函数改变了全局变量foo的值,而代码段又需要保留foo的原始值时,这个用法也很有用,尤其是在进行运行时动态替换(monkey patching,猴子补丁)时。即使其他代码把print动态替换成了其他函数,在local print=print语句之前的所有代码使用的还都是原先的print函数。
所有的控制结构语法上都有一个显式的终结符:end用于终结if、for及while结构,until用于终结repeat结构。
Lua语言将所有不是false和nil的值当作真(特别地,Lua语言将0和空字符串也当作真)。
如果要编写嵌套的if语句,可以使用elseif。它类似于在else后面紧跟一个if,但可以避免重复使用end:
当条件为真时while循环会重复执行其循环体。Lua语言先测试while语句的条件,若条件为假则循环结束;否则,Lua会执行循环体并不断地重复这个过程
repeat–until语句会重复执行其循环体直到条件为真时结束。由于条件测试在循环体之后执行,所以循环体至少会执行一次。
和大多数其他编程语言不同,在Lua语言中,循环体内声明的局部变量的作用域包括测试条件
for语句有两种形式:数值型(numerical)for和泛型(generic)for。
在这种循环中,var的值从exp1变化到exp2之前的每次循环会执行something,并在每次循环结束后将步长(step)exp3增加到var上。第三个表达式exp3是可选的,若不存在,Lua语言会默认步长值为1。如果不想给循环设置上限,可以使用常量math.huge:
首先,在循环开始前,三个表达式都会运行一次;其次,控制变量是被for语句自动声明的局部变量,且其作用范围仅限于循环体内。一种典型的错误是认为控制变量在循环结束后仍然存在:
如果需要在循环结束后使用控制变量的值(通常在中断循环时),则必须将控制变量的值保存到另一个变量中:
泛型for遍历迭代函数返回的所有值,例如我们已经在很多示例中看到过的pairs、ipairs和io.lines等。虽然泛型for看似简单,但它的功能非常强大。使用恰当的迭代器可以在保证代码可读性的情况下遍历几乎所有的数据结构。
与数值型for不同,泛型for可以使用多个变量,这些变量在每次循环时都会更新。当第一个变量变为nil时,循环终止。像数值型for一样,控制变量是循环体中的局部变量,我们也不应该在循环中改变其值。
我们可以使用break语句结束循环,该语句会中断包含它的内层循环(例如for、repeat或者while);该语句不能在循环外使用。break中断后,程序会紧接着被中断的循环继续执行。
return语句用于返回函数的执行结果或简单地结束函数的运行。所有函数的最后都有一个隐含的return,因此我们不需要在每一个没有返还值的函数最后书写return语句。
在Lua语言中,goto语句的语法非常传统,即保留字goto后面紧跟着标签名,标签名可以是任意有效的标识符。标签名称前后各紧跟两个冒号,形如::name::
在使用goto跳转时,Lua语言设置了一些限制条件。首先,标签遵循常见的可见性规则,因此不能直接跳转到一个代码块中的标签(因为代码块中的标签对外不可见)。其次,goto不能跳转到函数外(注意第一条规则已经排除了跳转进一个函数的可能性)。最后,goto不能跳转到局部变量的作用域。
Lua语言规范中一个很有用的细节是,局部变量的作用域终止于声明变量的代码块中的最后一个有效(non-void)语句处,标签被认为是无效(void)语句。