赋值
1.Lua支持多重赋值:a,b = 10,2*x 等价于 a = 10, b=2*x。
2.多重赋值中,先对等号右边的所有元素求值,然后才执行赋值。因此,交换两个变量只需要这么表示:
3.多重赋值时,当左边个数多于右边时,多余的变量将赋为nil,当右边的个数多于左边,那么多余的值会被丢弃。
局部变量与块(block)
1.用local语句来创建局部变量,局部变量的作用域仅限于声明它们的那个块:
2.显式地界定一个块可用do-end关键字,用于严格控制某些局部变量:
3.“尽可能地使用局部变量”是一种良好的编程风格。局部变量可以避免将一些无用的名称引入全局环境,避免弄坏了全局环境。并且访问局部变量比访问全局变量快。最后,局部变量会随着其作用域的结束而消失,进而被GC回收。
4.Lua讲局部变量的声明当做语句处理。局部变量只有在声明之后才是可见(visible)的。
5.创建一个局部变量foo并用全局变量foo的值初始化它,可以保存全局变量foo的值,避免被后续函数改变,并且能加速当前作用域对foo的访问。
6.在一个块的中间使用声明语句可以让这个变量在初始化时刻就拥有一个有意义的初值,并且缩短它的作用域,这样有助于提高代码的可读性。
控制结构
1.控制结构包括:if(条件),while、repeat、for(迭代)。其中if、for 和 while 用end结尾,repeat用until结尾,并且所有不是false和nil的值都视为真。
if then else
1.根据if后条件的真假来判断执行then或者else语句。
while
1.重复执行循环体直到while的条件为假。
repeat
1.重复执行循环体直到repeat的条件为真。
数字型for(numeric for)
1.var从exp1变化到exp2,每次变化都已exp3为步长(step)递增var,并执行一次执行体。弱exp3不指定,默认为1。
2.for的三个表达式是在循环开始前一次性求值的,并且控制变量会被自动声明为for语句的局部变量,仅在循环体内可见,在循环结束后就不存在了。如果要在循环结束后访问控制变量的值,应将值保存到另一个变量中。
泛型for
1.ipairs,用于遍历数组的迭代器函数,每次循环中,i会被赋予一个索引值,同时v被赋予一个对应索引的数组元素值。
2.通过不同的迭代器,泛型for几乎可以遍历所有的东西,而且代码极具可读性。标准库中的迭代器包括:文件中每行的(io.lines),迭代table元素的(pairs),迭代数组元素的(ipairs),迭代字符串中单词的(string.gmatch)等。迭代器也能自己编写。
3.泛型for与数字for的相同点,一是循环变量是循环体的局部变量;二是执行体中绝不应该对循环变量作任何赋值。
4.具体示例,要将一周中每天名称的表days转换成它再一周中的位置:
break与return
1.break 和 return 用于跳出当前的块。并且只能是一个块的最后一条语句,或者end,else或until前的一条语句,因为位于它们之后的语句无法被执行到。
2.break,用于结束一个循环,它只会跳出包含它的一个内部循环(for,repeat或while),而不改变外层的循环。
3.return,用于从一个函数中返回结果,或者用于简单地结束一个函数的执行。
4.如果希望在一个块中间插入一句return或break,可以使用一个显式的do块来保住一条return语句: