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”中,否则无法找到目标文件。
热门跟贴