1、编译
dofile和loadfile加载文件。loadfile仅仅编译代码块,并且返回编译后的代码块作为函数。
loadfile在出错时返回nil和错误信息,并且可以加载一次,调用结果多次。
load与loadfile相似,从函数或者字符串读取代码块,不是从文件
f = load("i = i + 1")
i = 0
f(); print(i)
f(); print(i)
输出:
1
2
加载并且调用使用load(s)(),如果出现错误,会返回nil,并且返回错误信息"attempt to call a nil value",如果需要详细的错误信息,可以使用assert(load(s))()
load没有词法作用域,使用全局作用域的。
i = 32
local i = 0
f = load("i = i + 1; print(i)")
g = function() i = i + 1; print(i) end
f()
g()
输出:
33
1
lua将任意独立的代码块视为匿名变参函数的函数体。比如load("a=1")相当于
function (...) a = 1 end
2、预编译代码
使用luac来预编译代码。比如 lua -o prog.lc prog.lua,然后执行使用lua prog.lc
load和loadfile接受预编译代码。
3、错误
使用error函数来抛出错误。
assert函数也可以抛出错误,第一个参数不为false,则返回这个参数,否则会抛出错误。第二个参数表示错误信息。
4、错误处理及异常
处理错误使用pcall函数。