Chunk

Lua 的执行单元被称作 Chunk,一个 Chunk 是一条语句(赋值、控制结构、函数调用、变量声明)序列,它们会按次序执行。每个语句可以以分号结束:

语句结尾的分号是可选的,但是如果同一行有多条语句最好使用分号隔开。

Lua 不允许空语句,所以 ';;' 是非法的。(Lua 5.3 开始支持空语句

Lua 把 Chunk 当作拥有不定参数的匿名函数处理,因此可以在 Chunk 内部定义局部变量、接收参数、返回值。

也可以在 Chunk 内部声明局部函数,该函数仅在 Chunk 内可见,词法定界保证包内其他函数可以调用此类函数。

在 Chunk 内部定义多个 Local Function,并且相互调用(或定义 Local 递归调用函数)时,最好先声明,再定义。

Chunk 可以被保存在文件中,也可以被保存在宿主程序的一个字符串中。 当 Chunk 被执行时,它将被预编译成指令序列, 然后虚拟机解释运行这些指令。

Chunk 也可以被预编译成二进制形式,用源码形式提供的程序和二进制形式的程序可以相互替换。Lua 自动识别文件类型,并做正确的处理。

连接外部 Chunk 的一种方式是使用 dofile 函数,该函数加载文件,并执行它。假设有如下的源文件:

在交互模式下,执行:

一个源代码文件;在交互模式中输入的一段代码或一个函数都是 Chunk。


Block

从语法上讲,Block 就是 Chunk:

语句块可以被显式地写成单独的语句段:

显式的语句块对于控制变量的作用范围很有用。 有时显式的语句块被用来在另一个语句块中插入 return 或 break。

函数调用和赋值语句都可能以小括号开头, 这可能让 Lua 的语法产生歧义。 我们来看看下面的代码片断:

从语法上说,可能有两种解释方式:

当前的解析器总是用第一种结构来解析, 它将括号看成函数调用的参数传递开始。 为避免这种二义性, 在语句以小括号开头时,前面放一个分号是个好习惯:


参考文档