2.5 程序段

程序段(chunk)是Lua语言中很基础的一个概念,在前面我们已经提及过,与变量的作用域相关。程序段可以理解为Lua语言的一段代码,即一组命令或表达式组成的序列;这个序列可以是一个文件中的全部代码,也可以是一个函数内的代码,还可以是一个控制结构内的代码。在程序段前定义的全局变量在程序段内可以访问;在程序段内定义的局部变量,作用域即为本程序段。

Lua是一种编写风格比较灵活的编程语言,语句可以和函数定义混排在一起组成一个程序段,甚至可以在一个函数中完成另一个函数的定义。在执行程序段时,其中的语句会直接运行;其中的函数需要调用。这样可以将整个文件作为一个程序段,在另一个文件中来进行编译、运行等。在文件“test.lua”编写如下内容,这些都是我们前面进行过的练习。

a = 20 -- 全局变量

print(type(a)) -- 输出a的数据类型, number

a = string.format('%02X', a) --将a转换为16进制数对应的字符串

print(a, type(a)) --输出a的数据类型, string

local b = 50 -- 局部变量

function variable_show()

c = 5 -- 全局变量

local d = 6 -- 局部变量

end

variable_show()

print(c,d) --c为全局变量,此处可以访问到;d的作用域中函数variabel_show()之内,此处无法访问到

do

local a = 6 -- 局部变量,不改变全局变量a的值

b = 6 -- 此处可以访问到局部变量b,对局部变量b重新赋值

print(a,b); -- print()函数中访问的为局部变量a(第16行创建)、局部变量b(第5行定义、第17行重新赋值),6,6

end

print(a,b) --print()函数中访问的为全局变量a(第1行创建、第3行重新赋值)、局部变量b(第5行定义、第17行重新赋值),14,6

print('你好,中国!')

x = 0.2

y = math.sin(x)

print(y)

function string_concat(separator, ...)

--输入为多个字符串

--输出为拼接完成的字符串

--对输入的字符串按顺序进行拼接

local args = {...}

local result = ''

for i = 1, #args do

if i == 1 then

result = result .. args[i]

else

result = result .. separator .. args[i]

end

end

return result

end

print('0: ', string_concat())

print('1: ', string_concat('_', 'abc'))

print('2: ', string_concat('_', 'abc', '123'))

print('3: ', string_concat('_', 'abc', '123', 'Lua'))

在另一个文件“run.lua”中我们写入以下内容,可以进行测试。

dofile('test.lua')

print('0: ', string_concat(‘12345’))

编译运行后结果如下图所示。由图可见,dofile(‘test.lua’)会将整个文件作为一个程序段执行,而且“test.lua”中的全局变量中文件“run.lua”中可以调用“test.lua”中的局部变量在文件“run.lua”中不可以调用

require()可以实现和dofile()相似的功能,但require()仅在第一次调用时会进行执行文件,再次调用时仅加载而不会再次执行。loadfile()会加载文件并将整个文件作为一个函数变量返回,并不会运行文件中的代码;如果要运行文件中的代码需要调用返回的函数。可以参考下图加深对require()和loadfile()的理解。需要注意的是调用函数require()时需要把“test.lua”的文件路径添加到“package.math”中,否则无法找到目标文件。