--编译与运行Lua外部代码块有三种形式:
--loadfile 编译Lua外部代码块,但不会运行代码,将会以函数的形式返回编译结果。
--dofile 直接编译运行Lua外部代码块,并不返回任何结果。Dofile是loadfile 的进一步简化封装。
--load 编译字符串中的代码,而非从文件读取。
--[[--使用“loadfile"函数,调用lua外部脚本]]
--[[
local externalFile=loadfile("C1_IsInvokedModel.lua")
--local externalFile=loadfile("D://C1_IsInvokedModel.lua") --使用路径
--测试得到的外部lua变量
print(externalFile)
print("变量的类型: ",type(externalFile))
--调用此函数(本步骤是必须的!)
externalFile()
--调用外部lua文件函数与变量
ShowInfo() --调用全局函数
--ShowInfoByLocal() --调用局部函数, 会引发异常
print(num1) -- 调用全局变量
--print(num2) -- 调用局部变量, 输出nil (但不会报错)
]]
--[[--使用“dofile"函数,调用lua外部脚本
--规律: dofile 函数,不返回结果,也无需执行返回结果。
-- 即: 直接编译且运行外部lua脚本
]]
--[[
local externalFile2=dofile("C1_IsInvokedModel.lua")
----测试得到的外部lua变量
print(externalFile2) --nil
print("变量的类型: ",type(externalFile2)) --变量的类型: nil
--调用全局函数
ShowInfo()
--调用全局变量
print(num1)
]]
--[[--学习使用 "load()"函数,直接执行lua代码]]
local result1=load("print('This is lua info')")
--测试
print(result1)
print(type(result1))
--运行返回函数
result1()
--演示 load 函数性质1: 总是在全局环境下编译字符串
--函数性质2: 字符串形式的lua脚本,如果出错,则不会显示错误信息。
num1=1000
local num1=30
fun1=load("num1=num1+1 print(num1)") --字符串形式的lua脚本
fun2=function() num1=num1+1 print(num1) end
fun1() --output: 1001
--本文件定义的函数优先取局部变量
fun2() --output: 31
--lua语言主要使用 error()/assert() 函数来抛出错误
--使用pcall()/xpcall()来捕获错误。
--[[--学习引发(抛出)错误]]
--使用"error "函数。
local num=123
--local num=nil
if(not num) then
error("error: 出现错误了!, 请输入合法数值!")
else
print("数值合法。 进行下一步")
end
--使用assert() 函数
--assert(a,b)参数a是要检查是否有错误的一个参数,b是a错误时抛出
--的信息。第二个参数b是可选的
local num=123
--local num=nil
result=assert(num, "Error: 请输出合法数值!")
print(result)
--[[--进一步举例,关于Asset 函数使用。]]
numInput="abc"
res1=tonumber(numInput)
print("res1=",res1)
--改进措施
numInput="10"
res=assert(tonumber(numInput), "发生错误: 请输入一个数值型数据,不要写字符组合!")
print(res)
--[[--使用pcall() 函数,来捕获错误。]]
--pcall函数可以捕获函数执行中的任何错误,如果没有发生错误,那么返
-- 回true及函数调用的返回值,否则返回false及错误信息。
--定义错误函数
function HavaError()
error({error="本方法有错误发生!"})
end
--捕获异常
local resFlag,errorInfo=pcall(HavaError)
if(resFlag) then
print("正确执行代码!")
else
print("发生错误: ",errorInfo.error)
end
--[[--使用xpcall() 函数,来捕获错误。]]
--如果希望我们捕获错误信息,且显示完整的堆栈错误信息,则需要使用xpcall 函数。
--xpcall ()函数必须输入两个函数,前者是可能引发错误的函数,后者是错误处理函数。
--错误事件源
function HavaError()
error({error="本方法有错误发生!"}) --去掉注释,表示本函数,不会出现错误。
end
--错误的处理函数(如何处理错误)
function ProcessError()
print("发生错误: ,详细堆栈信息如下: ")
print(debug.traceback())
end
--捕获错误信息
local procFlag=xpcall(HavaError, ProcessError)
if(procFlag) then
print("正确执行语句")
end
print("后续语句,继续运行....")
--[[--lua的垃圾收集机制]]
print(collectgarbage("count")) --显示lua占用的总内存数 [以k字节为单位]
print("开始给Table填充大量数据")
myTable={}
for i = 1, 100000 do
myTable[i]=i
end
print("给Table填充大量数据完毕! ")
print(collectgarbage("count")) --显示lua占用的总内存数
--Table 资源释放
myTable=nil
print(collectgarbage("count")) --显示lua占用的总内存数
--强制进行垃圾收集处理
collectgarbage("collect")
print(collectgarbage("count")) --显示lua占用的总内存数