Lua学习笔记(3)——语句

赋值

1.Lua支持多重赋值:a,b = 10,2*x  等价于 a = 10, b=2*x。

2.多重赋值中,先对等号右边的所有元素求值,然后才执行赋值。因此,交换两个变量只需要这么表示:

交换两个变量

3.多重赋值时,当左边个数多于右边时,多余的变量将赋为nil,当右边的个数多于左边,那么多余的值会被丢弃。

Lua学习笔记(3)——语句_第1张图片
多重赋值个数不等时

局部变量与块(block)

1.用local语句来创建局部变量,局部变量的作用域仅限于声明它们的那个块:

局部变量

2.显式地界定一个块可用do-end关键字,用于严格控制某些局部变量:

Lua学习笔记(3)——语句_第2张图片
do-end 块

3.“尽可能地使用局部变量”是一种良好的编程风格。局部变量可以避免将一些无用的名称引入全局环境,避免弄坏了全局环境。并且访问局部变量比访问全局变量快。最后,局部变量会随着其作用域的结束而消失,进而被GC回收。

4.Lua讲局部变量的声明当做语句处理。局部变量只有在声明之后才是可见(visible)的。

Lua学习笔记(3)——语句_第3张图片
局部变量

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语句。

Lua学习笔记(3)——语句_第4张图片
if 语法
Lua学习笔记(3)——语句_第5张图片
嵌套的if

while

1.重复执行循环体直到while的条件为假。

Lua学习笔记(3)——语句_第6张图片
while语法

repeat

1.重复执行循环体直到repeat的条件为真。

Lua学习笔记(3)——语句_第7张图片
repeat语法

数字型for(numeric for)

数字型for语法

1.var从exp1变化到exp2,每次变化都已exp3为步长(step)递增var,并执行一次执行体。弱exp3不指定,默认为1。

Lua学习笔记(3)——语句_第8张图片
示例

2.for的三个表达式是在循环开始前一次性求值的,并且控制变量会被自动声明为for语句的局部变量,仅在循环体内可见,在循环结束后就不存在了。如果要在循环结束后访问控制变量的值,应将值保存到另一个变量中。

控制变量是局部的
Lua学习笔记(3)——语句_第9张图片
循环结束后要访问控制变量的值 i

泛型for


泛型for语法(打印数组a的所有值)
示例

1.ipairs,用于遍历数组的迭代器函数,每次循环中,i会被赋予一个索引值,同时v被赋予一个对应索引的数组元素值。

2.通过不同的迭代器,泛型for几乎可以遍历所有的东西,而且代码极具可读性。标准库中的迭代器包括:文件中每行的(io.lines),迭代table元素的(pairs),迭代数组元素的(ipairs),迭代字符串中单词的(string.gmatch)等。迭代器也能自己编写。

3.泛型for与数字for的相同点,一是循环变量是循环体的局部变量;二是执行体中绝不应该对循环变量作任何赋值。

4.具体示例,要将一周中每天名称的表days转换成它再一周中的位置:

一周中每天的名称
创建一个逆向table,以名称作为索引,位置作为值
revDays的最后结果

break与return

1.break 和 return 用于跳出当前的块。并且只能是一个块的最后一条语句,或者end,else或until前的一条语句,因为位于它们之后的语句无法被执行到。

break是then块的最后一条语句


2.break,用于结束一个循环,它只会跳出包含它的一个内部循环(for,repeat或while),而不改变外层的循环。

3.return,用于从一个函数中返回结果,或者用于简单地结束一个函数的执行。

4.如果希望在一个块中间插入一句return或break,可以使用一个显式的do块来保住一条return语句:

Lua学习笔记(3)——语句_第10张图片
块中插入return或break

你可能感兴趣的:(Lua学习笔记(3)——语句)